POJ 2406 Power Strings

来源:互联网 发布:js array push index 编辑:程序博客网 时间:2024/06/14 04:12

题意:对于两个字符串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");    }}

0 0