题目描述:
循环节
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节。
对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度最小的那一个为最小循环节。
输入
多组输入。
每组输入一个字符串,长度不大于80,只包含26个小写字母。
输出
输出一个字符串,代表最小循环节。
示例输入
aaaa abab
示例输出
a ab
提示
解题思路:由题意知串A是由N个完整的串B组成的,可求串A长度的质因子,且B的长度必是A的质因子中的一个,然后对A质因子的每一种情况进行枚举讨论。
参考代码:
#include <stdio.h>
#include <string.h>
#define N 100
int main()
{
char s[N];
int len,i,j,k,a[N],cout;
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
for(cout=0,i=1;i<=len;i++)
if(len%i==0)
a[cout++]=i;
/*
puts("3¤?èòò×ó:");
for(i=0;i<cout;i++)
printf("%d ",a[i]);
putchar('\n');
*/
for(i=0;i<cout;i++)
{
k=a[i];
for(j=0;j<len;j++)
if(s[j]!=s[j%k]) break;
if(j>=len) break;
}
if(i<cout)
for(j=0;j<k;j++)
putchar(s[j]);
putchar('\n');
}
return 0;
}