这个题看着很简单,但是卡了我好几个点。
1.输出格式。题目要求每两个输出数据之间间隔两个换行符,也就是间隔一个空行,而不是空格,最后一个数据只输出一个换行符。一般的方法就能处理过去。
2.极端情况。这种包含对称啊,镜像啊,重叠啊,周期啊,什么的,一定要考虑到如果整个串都不满足条件,应该怎么办。比如说这道题,如果整个串都没有周期,那么应该输出什么呢?我最后一次WA就没考虑到这种情况,其实这时候应该输出整个字符串的长,因为这是可以看做他以他整个自己为周期。
3.字符串切分、连加包含的下标计算。我经常在这里出错,其实,如果容易混淆,就先抽象运行一下最开始的一两次循环,别想当然,仔细思考这个实例是不是没有逻辑错误。其实,只要刚开始的几个没有循环和下标计算错误,后面的出问题的几率几乎为零。
下面是代码,我用的算法是从头开始依次切分,每次切分都循环相加,看是不是最小周期。里面判断最小周期时和字符串无周期时,用了两个小技巧。
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
string s,t;
cin>>n;
while (n--) {
bool flag=false;
cin>>s;
for (int i=1;i<(int)s.size();i++) {
t=s.substr(0,i);
int cc=t.size(),ct=1;
string ts=t;
while (t.size()<=s.size()) {
if (t!=s.substr(0,cc*ct)) break;
ct++;
t+=ts;
}
if (t==s+ts) {
v.push_back(i);
flag=true;
break;
}
}
if (!flag) v.push_back((int)s.size());
}
int si=v.size();
for (int i=0;i<si;i++) {
if (i!=si-1) cout<<v[i]<<'\n'<<endl;
else cout<<v[i]<<endl;
}
return 0;
}