求一段长度为k的字符串的最小重复周期(k<=80),代码:
思路:
周期串长度n必然能被k整除,在这一条件下,对周期小于k/2的,进行验证,验证k/n-1次,取最先成功的重复周期长度或k为最终结果
小技巧:
如果题目要求“两结果之间”有换行,那么对于最后一个case,可利用以下代码高亮处的方式来处理,使代码更简洁美观巧妙。
#include"iostream" #include"cctype" #include"cstring" using namespace std; #define maxn 85 //#define local int judge(char *s,int k,int len) { int n=len/k; //倍数/比较几次 for(int j=1;j<n;j++) for(int i=0;i<k;i++) if(s[i]!=s[i+j*k]) return 0; return 1; } int main() { #ifdef local freopen("UVa_in.txt","r",stdin); // freopen("UVa_out.txt","w",stdout); #endif char s[maxn]; int cont,len; scanf("%d",&cont); while(cont--){ scanf("%s",s); len=strlen(s); int mark=1; for(int i=1;i<=len/2;i++){ //被比较串的结尾com,由0->len-1 if(len%i==0) if(judge(s,i,len)) { cout<<i<<endl; mark=0; break; } } if(mark==1) cout<<len<<endl; if(cont)cout<<endl; } return 0; }