poj 2406 还是KMP的简单应用
2012-04-04 11:24
363 查看
记住KMP是多计算一位的。其中next[i]为不为自身的最大首尾重复子串长度。
位移j=i-next[i]可以看作是构成字符串s的字串(如果i%j==0,存在这样的构成),相应的重复次数也就是n/d。
a b c d *
next:-1 0 0 0 0 这时j=i-next[i]; 结果是j==i;于是得到i/j=1.
a b c a *
next:-1 0 0 0 1 这时j=i-next[i]; 结果是i%j!=0.但是结果还是1。所以这题要考虑如果i%j!=0时也要输出1.即自身。这只是字串等于自身的一种情况。上面的那种情况也是一种
位移j=i-next[i]可以看作是构成字符串s的字串(如果i%j==0,存在这样的构成),相应的重复次数也就是n/d。
a b c d *
next:-1 0 0 0 0 这时j=i-next[i]; 结果是j==i;于是得到i/j=1.
a b c a *
next:-1 0 0 0 1 这时j=i-next[i]; 结果是i%j!=0.但是结果还是1。所以这题要考虑如果i%j!=0时也要输出1.即自身。这只是字串等于自身的一种情况。上面的那种情况也是一种
#include <iostream> #include <fstream> #include <string.h> using namespace std; #define N 1000001 int next ; void get_next(char *s) { int i=0,j=-1,len=strlen(s); next[i]=j; while(i<len) { while(j>=0 && s[i]!=s[j]) j=next[j]; i++; j++; next[i]=j; } } int main() { char str ; int i,j; freopen("acm.txt","r",stdin); while(scanf("%s",str)!=EOF && str[0]!='.') { get_next(str); i=strlen(str); j=i-next[i]; if(i%j==0) printf("%d\n",i/j); else printf("1\n"); } return 0; }
相关文章推荐
- POJ 2752、2406、1961 KMP的next[](或p[])简单应用
- POJ 2406 kmp简单应用
- poj-2406 kmp中的next数组应用
- poj 2406 Power Strings 【KMP的应用】
- poj 2406 Power Strings[kmp,next数组的应用]
- POJ 2406 KMP next数组的应用
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
- poj 2406 KMP应用
- POJ 2406 KMP next数组的应用
- POJ 2752: S 4000 eek the Name, Seek the Fame(简单KMP-NEXT数组的应用)
- poj 2406 Power Strings(kmp next数组的应用)
- POJ 1961/POJ 2406 /POJ 2752 /【KMP应用】
- POJ -2406 power strings --KMP中next函数的应用
- poj 2406 Power Strings(kmp应用)
- poj--3080Blue Jeans KMP的简单应用
- poj2406--kmp next的应用
- Power Strings(POJ-2406)(KMP简单循环节)
- (简单) POJ 2406 Power Strings,扩展KMP。
- Power Strings POJ 2406【KMP Next的应用】
- POJ 2406 Power Strings 1961的简化版,kmp的next数组的应用