UVA10298 Power Strings

题目描述

PDF

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1: 
abcd
aaaa
ababab
.
输出样例#1: 
1
4
3

Solution:

  题意就是求每个串的最小循环节的循环次数。

  裸的kmp,直接对串求一下next值,考虑到最长公共前后缀的性质,画画图不难发现,当原串拥有循环节时,必定满足条件$next[n] eq 0$且$(n-next[n])|n$,此时最小循环节长度显然就是$n-next[n]$,循环次数就是$frac{n}{n-next[n]}$。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=1e7+2;
int f[N];
char s[N];

int main(){
    while(scanf("%s",s)==1){
        if(s[0]=='.')exit(0);
        int n=strlen(s),p=0;
        For(i,1,n-1){
            while(p&&s[i]!=s[p])p=f[p];
            if(s[i]==s[p])f[i+1]=(++p);
            else f[i+1]=0;
        }
        printf("%d
",(!f[n]||f[n]&&n%(n-f[n])?1:n/(n-f[n])));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/five20/p/9470469.html