字符串/KMP
字符串/KMP
kelianlee
这个作者很懒,什么都没留下…
展开
-
Oulipo HDU - 1686(KMP)
题意 给你一个文本串,一个模式串,问文本串中有几个模式串 思路 第一道kmp,kmp算法本身很好理解,但是求next数组需要好好体会。 #include <iostream> #include <cstring> using namespace std; const int MAXN=1e6+10; char str1[MAXN],str2[MAXN]; i...原创 2019-05-28 00:02:44 · 127 阅读 · 0 评论 -
Unlucky Strings LightOJ - 1268(留)
留原创 2019-05-29 14:37:01 · 141 阅读 · 0 评论 -
Making Huge Palindromes LightOJ - 1258(KMP)
题目 给你串A问你在串A的后尾加多少个字符串使得A是一个回文串,输出回文串的总长度 思路 因为是在末尾加字符串所以就会有两种情况: 1 末尾的字符串在A中有回文 2 末尾的字符串在A中没有回文 这样我们就可以把A翻转在在对原来的字符串做KMP了 #include <iostream> #include <cstring> #include <cstdi...原创 2019-05-29 14:34:11 · 233 阅读 · 0 评论 -
Bazinga HDU - 5510(KMP玄学)
思路 数据比较水啊,我们只需要遍历所有的字符串将字符串i与字符串i+1做KMP比较看是不是子串,如果是子串那么这些字符串都不需要考虑,如果不是子串我们就放到数组num里,最后只要遍历num里的所有字符串就可以了???但是这不是很玄学嘛?如果500个字符串都不一样,那么num里面就是500,每个字符串长度2000做一次KMP就是O(n+m)=O(4000)500*4000+499*4000+。。。...原创 2019-05-29 00:16:25 · 231 阅读 · 0 评论 -
Theme Section HDU - 4763(KMP)
题意 比如现在有个字符串A是ab,我们有个字符串B是E,我们要进行字符串拼接为EaEbE记为字符串C,现在的问题是已经知道字符串C问你B字符串的最大长度是多少 思路 很容易想到KMP的next数组,记len为字符串长度,如果k=next[len](因为next数组是右移动一位,所以是next[len]),2*k<len那么说明前后在已经相同,我们只要在去掉前后缀的字符串中用KMP看是否...原创 2019-05-29 00:11:18 · 210 阅读 · 0 评论 -
Simpsons’ Hidden Talents HDU - 2594 (字符串hash)
题意 给你字符串A,B问你A中的前缀字符是B的后缀字符串的最大长度 思路 由于数据比较小,可以用字符串hash,把所有的hash值求出来,然后遍历所有的A字符串的前缀判断B的后缀字符串两者的hash值是不是相同就可以 #include <iostream> #include <cstring> #include <cstdio> using name...原创 2019-05-28 23:59:09 · 340 阅读 · 0 评论 -
Cyclic Nacklace HDU - 3746(KMP补全循环节)
题意 给你一个串A,问你需要再补充多少个字符,才能让A字符是一个具有循环节的字符串 思路 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。 (1)如果len可以被len - next[len]整除,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。 (2)如果不能,说明还需要再添加几...原创 2019-05-28 23:56:48 · 151 阅读 · 0 评论 -
Count the string HDU - 3336(KMP/next数组)
题目 给出一个串A,求A串的所有前缀子串在A中出现的次数求和 思路 next数组表示的最大前后缀的长度,我们只要求出所有的next数组,对于next[i]=k说明前缀长度k的前缀子串出现一次,所以我们开一个map把每个对应长度的next前缀长度存起来,最后加上n就可以了 #include <iostream> #include <map> using names...原创 2019-05-28 23:53:41 · 131 阅读 · 0 评论 -
Power Strings POJ - 2406(KMP最小循环节)
最小循环节T=len-next[len] #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN=1e7+10; char str[MAXN]; int snext[MAXN]; int len; void getnext() ...原创 2019-05-28 23:48:46 · 130 阅读 · 0 评论 -
Period POJ - 1961(KMP找最小循环节)
题目 给你字符串A,问你A串的所有的前缀子串中,有循环节的子串输出最小循环节 思路 典型的KMP找最小循环,只要遍历所有的前缀子串,找出所有前缀子串的最小循环节就可以。最小循环接周期T=字符串长度-next[len] 如果字符串长度%T==0说明存在最小循环节输出 #include <iostream> #include <cstring> #include &l...原创 2019-05-28 23:47:05 · 366 阅读 · 0 评论 -
Number Sequence HDU - 1711(KMP)
题目 给你文本串A,模式串B,问你模式串在文本串中出现的第一个位置 思路 模板KMP匹配 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN=1e6+10; int str1[MAXN],str2[MAXN]; i...原创 2019-05-28 23:41:59 · 122 阅读 · 0 评论 -
Revolving Digits HDU - 4333(扩展kmp)
题意 给你一个数字A每次将A的末尾的数往最前面调,多次操作之后回来原来的数问你在这一个过程中比原来的A大,小,等的数各有多少 思路 将A复制一遍插入A的末尾变成AA,只需要在AA中遍历A长度的字符串对于每次的i我们判断i+len(A)长度的数字与A做比较就可以,朴素的比较是n2,我们只需要求出AA与AA的扩展kmp,extend就是与AA的最长公共前缀,如果extend[i]>=len...原创 2019-07-31 21:15:50 · 130 阅读 · 0 评论