循环节
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节。
对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度
最小的那一个为最小循环节。
输入
多组输入。
每组输入一个字符串,长度不大于80,只包含26个小写字母。
输出
输出一个字符串,代表最小循环节。
示例输入
aaaa
abab
示例输出
a
ab
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char a[100],b[100];
int next[100];
int n,num=1;
void get_next()
{
int len=strlen(a);
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||a[i]==a[j])
{
i++;
j++;
if(a[i]!=a[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
int main()
{
int j;
while(~scanf("%s",a))
{
int len=strlen(a);
get_next();
n=len-next[len];//循环节的长度
if(len%n==0)
{
for(j=0;j<n;j++)
b[j]=a[j];
}
else//循环节为它本身
strcpy(b,aprintf("%s\n",b);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char a[100],b[100];
int next[100];
int n,num=1;
void get_next()
{
int len=strlen(a);
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||a[i]==a[j])
{
i++;
j++;
if(a[i]!=a[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
int main()
{
int j;
while(~scanf("%s",a))
{
int len=strlen(a);
get_next();
n=len-next[len];//循环节的长度
if(len%n==0)
{
for(j=0;j<n;j++)
b[j]=a[j];
}
else//循环节为它本身
strcpy(b,aprintf("%s\n",b);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}