题意:对于两个字符串a,b,定义a*b是将两个字符串a,b连结起来。同时定义a^n: a^0 = ""(空串),a^n = a ^ (n-1) * a;
问题:给定字符串s,判断s是否是a^n的形式。如果是输出最大的n
思路:利用KMP算法可以求出最短循环节。在KMP算法中,f[i]表示当前位置的字符失配后,向前跳转到的字符的位置。所以,如果一个字符串是幂的形式,对于最后一个字符, i - f[i]就是他的最小循环节。(想一下为什么。)因为字符串是幂的形式,那答案n = length / (i - f[i]);同时,如果不能整除,也说明无法表示成幂的形式。
代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 1001000;
char str[MAX];
int f[MAX];
int main(void)
{
while(scanf("%s",str), str[0] !='.'){
int n = strlen(str);
f[0] = f[1] = 0;
for(int i = 1; i < n; ++i){
int j = f[i];
while(j && str[i] != str[j]) j = f[j];
f[i+1] = str[i] == str[j]? j+1:0;
}
int len = n - f[n];
//printf("%d\n",len);
if(n % len == 0)
printf("%d\n",n / len);
else
printf("1\n");
}
}