首先,对这道题进行评价:有毒;
我一开始没有考虑到一种情况,只考虑了重复。即先第一个与第二个比较。后来第一个与第三个比较,第二个与第四比较。直到找到。但他有bug,那就是他不是重复。最后出现了bbabb。在此我看了c站的一篇博主的,让我找到了一个有效UVA刷题的网站,那就是:
https://www.udebug.com/UVa/455
有许多大佬的网站,对于他们的贡献只能说:”谢谢!”
最后我考虑了许多,在下面的评论中找到了环状周期法,下列是两种解法,一种是我自己对于这个方法的理解。另一种是我对与大佬提供的代码的理解并将其搞成了C语言;
上代码:
#include<stdio.h>
#include<string.h>
int main(){
int n;
scanf("%d",&n);
int i;
char a[1000],b[1000],c[1000];
for(i=0;i<n;i++){
scanf("%s",a);
int count=strlen(a);
int j,k,sum=1,x=0;
int flag=0;
while(count/sum>1){
x=0;
for(k=count-sum;k<count;k++){
b[x]=a[k];
x++;
}b[x]='\0';
for(j=0;j<count-sum;j++){
b[x]=a[j];
x++;
}b[x]='\0';
if(!strcmp(a,b)&&count%sum==0){
if(i!=n-1){
printf("%d\n\n",sum);
}
else{
printf("%d\n",sum);
}
flag=1;
break;
}sum++;
}
if(flag==0){
if(i!=n-1){
printf("%d\n\n",count);
}
else{
printf("%d\n",count);
}
}
}
return 0;
}
大佬代码:
#include<stdio.h>
#include<string.h>
int main(){
int n,s;
scanf("%d",&n);
for(s=0;s<n;s++){
char a[1000];
int i,j,k,t=1;
scanf("%s",a);
int len=strlen(a);
while(1){
int c=0;
for(i=0;i<len;i++){
if(a[i]==a[(t+i)%len]){
c++;
}
}
if(c==len)
break;
t++;
}
if(s!=n-1){
printf("%d\n\n",t);
}
else{
printf("%d\n",t);
}
}
return 0;
}
主要是对于求t;
当t=1是,a[0] compare a[1],a[1]比a[2].........主要是解决不重复问题;
t=2之后是解决重复问题;
当然,这个题目有毒之处在于其输出,UVA的题都好奇怪,输入没问题,输出没到最后一行都是\n\n;到了最后一个就是\n;