习题3-4 周期串 UVa455
感悟。
1、直接看英文原题的输入输出样例。
2、没写之前,思路比较复杂,还考虑过递归的方式。
3、写的过程抱着试一试的心里,竟然写出,而且代码还写得漂亮,真是想不到,提交WA,傻了,样例全通过,能找到一些难以通过的样例吗。
abc
3
abca
4
4、提交WA,彻底傻了,代码不可能有问题,搜索http://blog.csdn.net/thudaliangrx/article/details/50699439发现里面有while(t--),排查之下,才发现手中的英文版与网站里的对应不上,如下
手中
Sample Input
HoHoHo
Sample Output
2
Sample Input
1 HoHoHo
Sample Output
25、提交 Presentation error,明白离成功不远了,又查网站原题,发现漏了一句
Two consecutive input will separated by a blank line.
printf("%d\n",k);改成printf("%d\n\n",k);提交Presentation error,参考http://blog.csdn.net/thudaliangrx/article/details/50699439
改成
printf("%d\n",k);
if(T)
printf("\n");
提交AC,真受不了,核心算法没花什么时间,却在输出格式上费了太多周折。真是服了。
4、该题有着 程序3-2开灯问题 例题3-3回文词 例题3-6环状序列 影子。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
char s[100];
int main(){
int len;
int i;
int flag;
int k;
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s);
len=strlen(s);
flag=0;
k=0;
while(!flag){//没找到周期,继续循环
k++;
flag=1;
for(i=0;i<len;i++){
if(len%k==0){//数组长度必须是周期的整数倍,接下来才有资格判定是否为周期 ,WA时,漏了此条件
if(i+k<len)//判断数组是否越界
flag&=(s[i]==s[i+k]);
}
else{
flag=0;
break;
}
}
}
printf("%d\n",k);
if(T)
printf("\n");
}
return 0;
}