题目描述
思想
ababab 要重复的n次数最多的子串,显然子串越少越好。当子串即字符串本身时,n定有解为1,这是最小的。所以我们子串长度由大到小,途中对能整除的还原匹配,若一致则解构成功,此时即最小的长度,最大的n。
代码展示
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
string f[101];
int main() {
string m;
while (cin >> m, m != ".") { // 循环读取字符串直到遇到单独的句点 "."
for (int n = m.size(); n > 0; n--) { // 从字符串长度开始递减,尝试不同的周期长度
if (m.size() % n == 0) { // 如果字符串长度可以整除周期长度 n
int len = m.size() / n; // 计算出周期长度
string new1;
for (int i = 0; i < n; ++i) {
new1 += m.substr(0, len); // 构造新字符串 new1,将 m 的前 len 个字符重复 n 次
}
if (new1 == m) { // 如果新构造的字符串与原字符串相等
cout << n << endl; // 输出周期长度 n
break; // 跳出循环
}
}
}
}
return 0;
}