UVa455 - Periodic Strings 题解
题目
题目链接
题目大意
一个有用周期k的字符串是指他可以被一个长度为k的子串重复一定次数得到。比如字符串"abcabcabcabc"的周期是3,它是由子串"abc"重复4次得到的。它的周期也可以是6("abcabc"重复2次),也可以是12("abcabcabcabc"重复1次)。现在写一个程序来找出它的最小周期。
输入第一行为测试数据数量T。之后的输入为测试数据。测试数据为长度小于等于80的不含空格的字符串。每行测试数据之间有一个空行(包括与T之间)。
输出为每个测试数据的最小周期。两个输出之间有一个空行。
样例输入
1
HoHoHo
样例输出
2
题解
这道题很容易解决,从周期为1开始尝试,能够通过重复把整个字符串给制作出来的周期,就是好周期(滑稽.jpg)。
然而这道题最恶心的就是输入输出了。注意输入之间有空行,从原题目那里复制输入样例是没有空行的。而输出卡了我好久,吐血。
Then show the code.
#include <stdio.h>
#include <string.h>
int main(){
int T;
scanf("%d", &T);
char s[100], temp[100];
while(T--){
//获取输入之间的空行
getchar();
int len, minPeri, flag;
memset(s, 0, sizeof(s));
scanf("%s", s);
len = minPeri = strlen(s);
for(int i=1; i<=len; i++){
//如果字符串不能整除假设的周期i,那么i肯定不是周期
if(len%i) continue;
//flag=1为先假设i为最小周期
//temp数组为假设的最小周期对应的子串
flag = 1;
memset(temp, 0, sizeof(temp));
for(int j=0; j<i; j++)
temp[j] = s[j];
for(int j=0; j<len/i; j++){
for(int k=0; k<i; k++){
//发现字符串与子串对应的元素不相同就及时退出
if(temp[k] != s[i*j+k]){
flag = 0;
break;
}
}
//flag为0就确定i肯定不是周期 直接break
if(!flag) break;
}
if(flag){
minPeri = i;
break;
}
}
//注意这里的输出
//每个输出数据行之间要有一个空行
//在最后一个输出数据之后不能2个空行
printf("%d\n", minPeri);
if(T) printf("\n");
}
return 0;
}
不忘初心方得始终