POJ2406 Power String(KMP)
传送门
【题目分析】
相当于是求字符串的最小循环节,应用了KMP求最小循环节的知识。
看一个例子:
有这张图可以知道,因为nxt表示前缀与后缀相同的长度,所以只要虚线之前的部分相同,那么就可以开始循环证明相等。
可以发现,如果len(s)-nxt(s)能整除len(s)的话,那么这就是循环节长度。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
char s[MAXN];
int nxt[MAXN];
void get_nxt(){
nxt[0]=-1;
int k=-1;
int len=strlen(s);
for(int i=1;i<len;++i){
while(k>-1&&s[i]!=s[k+1])
k=nxt[k];
if(s[i]==s[k+1])
k++;
nxt[i]=k;
}
}
int main(){
while(1){
scanf("%s",s);
if(strlen(s)==1&&s[0]=='.')
break;
get_nxt();
int len=strlen(s);
if(len%(len-nxt[len-1]-1)==0){
cout<<len/(len-nxt[len-1]-1)<<'\n';
}
else
puts("1");
}
return 0;
}