Power Strings
题目大意:
给定一个字符串 str ,让你求它的子串s,str=s+s+s+s+s…,即由最多的子串组成,不存在的话输出1 , 简单来说就是求字符串最大循环节。
思路:
求字符串最大循环节问题 , 就用到了Kmp的Next数组,即 Next[i] 求Next[0]-Next[i] 共i个字符的最大公共前后缀,即验证** len - Next[len] **是否是len的因子
Code:
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int MOD=10007;
const int maxn=1000007;
char str[maxn];
int Next[maxn];
void get_next(char T[],int len)
{
int i=0;
Next[i]=-1;
int j=-1;
while(i<len){
if(j==-1||T[i]==T[j]){
i++;j++;
Next[i]=j;
}else{
j=Next[j];
}
}
}
int main(){
while(scanf("%s",str)!=EOF){
int ans;
if(str[0]=='.')break;
int len=strlen(str);
get_next(str,len);
if(len%(len-Next[len])==0){ //len-Next[len] 为子串s的长度
ans=len/(len-Next[len]);
// cout<<Next[len]<<endl;
}
else ans=1;
printf("%d\n",ans);
}
return 0;
}