C3-UVa455-Periodic Strings

平台:

UVa Online Judge

題號:

455 - Periodic Strings

題目連結:

q

題目說明:

如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的字符串,输出其最小周期。

範例輸入:

1
HoHoHo

範例輸出:

2

解題方法:

周期per从1开始凑。len % per != 0 退出。

程式碼:

 1 #include <cstdio>
 2 #include <cstring>
 3 const int N = 85;
 4 
 5 bool is_period(const char* str, int per) {
 6     int len = strlen(str);
 7     //余数不为0则不是周期
 8     if (len % per != 0) {
 9         return false;
10     }
11 
12     //因为比较,所以要减去一个周期
13     for (int t = 1; t * per <= len - per; t++) {
14         for (int i = 0; i < per; i++) {
15             if (str[i] != str[i+t*per]) {
16                 return false;
17             }
18         }
19     }
20     return true;
21 }
22 
23 void myPrint(bool& first, int n) {
24     if (!first) {
25         printf("\n");
26     }
27     else {
28         first = false;
29     }
30     printf("%d\n", n);
31 }
32 
33 int main() {
34     int T = 0;
35     scanf("%d", &T);
36     bool first = true;
37     while (T--) {
38         char str[N];
39         scanf("%s", str);
40         int smallest = strlen(str);
41         for (int i = 1; i <= strlen(str) / 2; i++) {
42             if (is_period(str,i)) {
43                 smallest = i;
44                 break;
45             }
46         }
47         myPrint(first, smallest);
48     }
49     return 0;
50 }

猜你喜欢

转载自www.cnblogs.com/lemonforce/p/13201502.html