![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串
Lupin123123
这个作者很懒,什么都没留下…
展开
-
Slot Machines
题目链接题目大意:求对于所有的k,数列去掉前k项后剩余部分的最小循环节p,k+p的最小值。思路:枚举k,计算a[k+1…n]的最小循环节p,维护k+p的最小值。tips:求a[k+1…n]的最小循环节p时,将数列翻转。#include<bits/stdc++.h>#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define INF 0x3f3f3f3ftypedef long long ll;cons原创 2021-09-07 00:35:48 · 108 阅读 · 0 评论 -
[ZOJ] P3228 Searching the String
ac自动机练手题,可以当成ac自动机不重叠匹配的模板。 题目链接由于有多个模式串要匹配,那么如果用kmp复杂度就是O(qn)O(qn)O(qn),这显然是吃不消的。那么就考虑用多模式串匹配的利器——ac自动机。时间复杂度接近O(n)O(n)O(n)。对于这道题要解决的第一个问题是如何实现不重叠匹配。思考后不难发现,只需记录trie图中的结点所表示的单词上一次在文本串中出现的位置即可。具体表现为下面的代码: void match2(char *s) //不可重叠 { int len=strle原创 2021-08-13 19:43:36 · 85 阅读 · 0 评论 -
[hdu] P2087 剪花布条
kmp不重叠匹配的模板题。在一般的kmp匹配中,是可以出现重叠匹配的。如果要求不重叠,应该做如下更改:void work(){ int j=0; for (int i=1; i<=len1; i++) { while(j && s2[j+1]!=s1[i]) j=p[j]; if (s2[j+1]==s1[i]) j++; if (j==len2) { ans++; j=0; //本来是j=p[j]; } }}完整代码:#inc原创 2021-08-12 23:59:36 · 57 阅读 · 0 评论 -
[学习笔记] KMP算法
KMP算法可以O(n)O(n)O(n)的时间内实现模式串与文本串匹配,而strstr的朴素方法要O(n2)O(n^2)O(n2)如果要在s1中对s2匹配,先看看朴素方法: for (int i=1; i<=strlen(s1+1); i++) { int flag=1; for (int j=1,k=i; j<=strlen(s2+1); j++,k++) { if (s1[k]!=s2[j]) { flag=0; break; } }原创 2021-08-12 23:22:06 · 84 阅读 · 0 评论 -
带括号的四则运算计算器
栈的应用,思想比较容易,代码实现起来还是比较烦的,尤其是处理括号的时候。不过确实锻炼coding的能力。大致思路:1.开两个栈,一个符号栈,一个数字栈。2.从头到尾遍历整个字符串,遇到运算符就把紧挨这个运算符的数字加到数字栈中,计算运算符之前的结果。遇到’(‘就直接放入符号栈,遇到’)‘就出栈到’('为止。具体代码:#include<bits/stdc++.h>#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0原创 2021-08-08 13:39:16 · 1350 阅读 · 1 评论 -
[hdu多校]CCPC Strings
题目链接题目大意:在所有长度为n且只含有c,p的字符串集合中,计算含有不重复的字串ccpc的个数。思路:1.若允许重复,即“…ccpccpc…”的被算成两个ccpc。于是我们可以认为n-3个位置上的ccpc都对答案贡献1,可以得到共有(n−3)×2n−4(n-3)\times2^{n-4}(n−3)×2n−4个ccpc 。2.下面重点讲怎么去除重复。重复是因为出现了"ccpc/cpc", “ccpc/ccpc/cpc”…这样的字串,我发现对于一个无重叠的ccpc子串,在其后面加上cpc,他立刻就变成原创 2021-08-05 18:05:17 · 294 阅读 · 1 评论 -
[模板] 后缀数组
int n,m;int height[maxn];char s[maxn];int rak[maxn],sa[maxn],tp[maxn],tax[maxn];void bucket() //桶排序{ for(int i=0; i<=m; ++i) tax[i]=0; for(int i=1; i<=n; ++i) tax[rak[i]]++; for(int i=1; i<=m; ++i) tax[i]+=tax[i-1]; for(int i=n; i>=1原创 2021-07-31 22:14:13 · 56 阅读 · 0 评论 -
[Luogu] P5546 公共串
题意:求n个字符串的最长公共子串思路:后缀数组+二分1.若是求两个字符串的最长公共子串的长度且两字符串不太长本可以用dp2. 因为后缀数组方便处理子串问题,所以可以将问题转化成特殊的子串问题。所以将若干字符串拼成一个字符串s,并记录这个长串的每一部分属于哪个短的字符串。3. 但是这跟求子串的最长重叠长度不同,子串是“分组”的。所以将各个子串连接的时候要用“特殊”的连接符。4. 所求的不是具体的串而是长度,且这个公共串有单调性,即公共串越短越能满足条件,越长越不能满足条件。所以考虑二分答案。5.原创 2021-08-02 02:46:13 · 138 阅读 · 0 评论 -
[Luogu] P2408 不同子串个数
题意:求一个字符串中互不相同的子串的个数解法:后缀数组思考为什么会有重复?因为后缀之间有lcp。如何去除重复?某一后缀的某部分前缀不与其他后缀构成lcp的时候这部分才有贡献。#include<iostream>#include<cstdio>#include<ctype.h>#include<cstring>#include<queue>using namespace std;typedef long long ll;co原创 2021-08-01 23:32:33 · 123 阅读 · 0 评论 -
[hdu] P5769 Substring
题意:求一个字符串包含某一个特定字符的互不相同的子串个数。思考过程:1.如果是求一个字符串所有互不相同的子串个数,这是容易的。因为只需要遍历这个字符串所有后缀,依次计算这个后缀对答案的贡献即可。遍历所有后缀并且逐个计算贡献是后缀数组解决字符串计数问题的关键。2.在模板题中,每个后缀的贡献是这个后缀的所有前缀数-lcp中的前缀数,这个问题中每个后缀的贡献是什么?类比后不难发现是后缀的所有前缀数-重复出现的前缀数-不包含特定字符的前缀数,当然有可能某一前缀即重复又不包含特定字符。如何计算每一个后缀不包原创 2021-08-01 23:21:18 · 59 阅读 · 0 评论 -
[hdu多校] Display Substring
思路:二分答案+后缀数组check如何check?1.预处理所给字符串的价值前缀和,记为sum[]2.枚举左端点,在sum[]中找到最靠右的pos,使sum[i…pos]的价值小于等于要check的值now。记所有价值小于now的子串为ans, 那么sum[i…pos]对ans的贡献就是pos-i+1-height[rk[i]]tips: height[rk[i]]表示以i为开头的后缀与字典序比它小一的后缀的lcp,lcp部分在之前已经被统计过了,所以应该减去#include<bits/st原创 2021-08-01 15:59:23 · 90 阅读 · 0 评论