POJ 1961 http://poj.org/problem?id=1961 Period
Description
Input
Output
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题意及思路:
//求出所有前缀(满足是两个或两个以上的循环节组成的字符串)
//输出前缀的位置[0-i-1]的i,以及循环节的个数
//KMP求解fail数组,i-f[i]就是循环节长度
//求出所有前缀(满足是两个或两个以上的循环节组成的字符串)
//输出前缀的位置[0-i-1]的i,以及循环节的个数
//KMP求解fail数组,i-f[i]就是循环节长度
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1000000 + 10;
char s[maxn];
int f[maxn];
int main()
{
int n,cas=1;
while(scanf("%d",&n)==1&&n){
scanf("%s",s);
//求fail数组
f[0]=f[1]=0;
for(int i=1;i0&&i%length==0) printf("%d %d\n",i,i/length);
}
printf("\n");
}
return 0;
}
POJ2406 http://poj.org/problem?id=2406 Power Strings
Description
Input
Output
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
Hint
题意及思路:
//比上一题简单,只需判断最后一个即可
//有则输出n/(n-f[n]),表示原串的都是次幂,就是几个原串的组成
//无则输出1,表示无循环就是原串的1次幂
//比上一题简单,只需判断最后一个即可
//有则输出n/(n-f[n]),表示原串的都是次幂,就是几个原串的组成
//无则输出1,表示无循环就是原串的1次幂
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1000000 + 10;
char s[maxn];
int f[maxn];
int main()
{
int n,cas=1;
while(scanf("%s",s)&&s[0]!='.'){
n=strlen(s);
//求fail数组
f[0]=f[1]=0;
for(int i=1;i0&&n%(n-f[n])==0) //满足上题的条件即可
printf("%d\n",n/(n-f[n]));
else printf("1\n");
}
return 0;
}