这道题求的是字符串由几个相同子串构成,正好可以利用kmp算法中的next数组。
next数组标记的是字符串中0 -> i-1 和 1 -> i 的最长公共长度, 设 s = t t t t t t, next[len] = 5, 这表示 s[0-4]和s[1-5] 的最长公共部分是 5 ,len = 6; 6 - 5 = 1 ,表示 s 的最小相同子串长度 是 1;则 len /(len-next[len])就是相同子串的个数。如果除不尽,则是1;
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int next1[1000005];
void get_next(string s){ // 求next数组 next数组会求到第 s.length() 位 next[i] 表示的是 0 - i , 和 i - s.length的最大公共长度
next1[0] = -1;
int j = -1;
for(int i=0, len = s.length() ; i<len ;){
if(j == -1 || s[j] == s[i]){
++j;
++i;
next1[i] = j;
}
else j = next1[j];
}
return ;
}
int main()
{
string s;
while(cin>>s){
memset(next1,0,sizeof(next1));
if(s==".") break;
get_next(s);
int len = s.length();
if(len%(len - next1[len]) ==0)
cout<<len/(len - next1[len]);
else cout<<1;
cout<<endl;
}
return 0;
}