平台:
UVa Online Judge
題號:
455 - Periodic Strings
題目連結:
q
題目說明:
如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的字符串,输出其最小周期。
範例輸入:
1
HoHoHo
範例輸出:
2
解題方法:
周期per从1开始凑。len % per != 0 退出。
程式碼:
1 #include2 #include 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 }