//主要理解next[]的生成过程,其余次要
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N=1e6;
char b[N+1];
int next[N];
int prenext(){
next[0]=-1;
int j=-1,i=0;
while(b[i]){
if(j!=-1 && b[i]!=b[j])j=next[j];
else{j++;i++;
next[i]=j;//这句话最后执行
}}
int len=strlen(b);
i=len-next[len];//如果最后一个位置不匹配,那么就会滚到len-j的位置,也就是最小重复字串的长度。
if(len%i == 0) return len/i;
return 1;
}
/*
int prenext(){
next[0]=0;
int j=0,i;
for(i=1;b[i];i++){
while(j>0 && b[i]!=b[j])j=next[j-1];
if(b[i]==b[j])j++;
next[i]=j;//这句话最后执行
}
int len=strlen(b);
i=len-next[len-1];//如果最后一个位置不匹配,那么就会滚到len-j的位置,也就是最小重复字串的长度。
if(len%i == 0) return len/i;
return 1;
}
*/
int main()
{
while(gets(b)&&b[0]!='.'){
memset(next,0,sizeof(next));
cout<<prenext()<<endl;
}
return 0;
}
poj2406 Power Strings
最新推荐文章于 2022-07-21 20:55:14 发布
本文详细解析了next[]数组的生成过程,并通过C++代码实现来解释如何找到字符串中的最小重复子串。
613

被折叠的 条评论
为什么被折叠?



