UVa455 - Periodic Strings 题解

题目

题目链接

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;
}
posted @ 2020-11-05 17:31  1v7w  阅读(148)  评论(0编辑  收藏  举报