e537: 00455 - Periodic Strings

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

CPE 一顆星

題目連結:https://zerojudge.tw/ShowProblem?problemid=e537

內容

如果一個字串可以通過將另一個長度為k的字串的一個或多個重複連接起來而形成,則它被稱為period k。
例如,字串”abcabcabcabc”具有period 3,因為它由字串”abc”的4個重複組成。
它還具有period 6 (兩個重複的”abcabc”)和period 12 (一個重複的”abcabcabcabc”)。

輸入第一列有一個整數 N 代表測資數,每筆測資第一列為一個空白,第二列為字串 s (s長度 <= 80)。

輸出最小的 period,兩個連續輸出由空白列分開。

範例輸入

1

HoHoHo

範例輸出

2

想法

可能的解為字串長度的因數,因此只要取因數由小到大判斷是否成立即可。

若長度為1就直接輸出1。

程式碼

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

int main(){
fastio;
int N, len, ans;
string s;
bool suc;
cin >> N;
while(N--){
cin >> s;
len = s.length();
if(len == 1){
cout << "1\n";
if(N != 0) cout << "\n";
continue;
}
for(int c = 1; c <= len/2; ++c){
suc = true;
if(!(len % c)){
for(int i = 0; i < c; ++i){
for(int j = i; j < len; j += c){
if(s[i] != s[j]){
suc = false;
break;
}
}
if(!suc) break;
}
if(suc){
cout << c << "\n";
break;
}
}
if(c == len/2) cout << len << "\n";
}
if(N != 0) cout << "\n";
}
return 0;
}