这个题看着很简单,但是卡了我好几个点。
1.输出格式。题目要求每两个输出数据之间间隔两个换行符,也就是间隔一个空行,而不是空格,最后一个数据只输出一个换行符。一般的方法就能处理过去。
2.极端情况。这种包含对称啊,镜像啊,重叠啊,周期啊,什么的,一定要考虑到如果整个串都不满足条件,应该怎么办。比如说这道题,如果整个串都没有周期,那么应该输出什么呢?我最后一次WA就没考虑到这种情况,其实这时候应该输出整个字符串的长,因为这是可以看做他以他整个自己为周期。
3.字符串切分、连加包含的下标计算。我经常在这里出错,其实,如果容易混淆,就先抽象运行一下最开始的一两次循环,别想当然,仔细思考这个实例是不是没有逻辑错误。其实,只要刚开始的几个没有循环和下标计算错误,后面的出问题的几率几乎为零。
下面是代码,我用的算法是从头开始依次切分,每次切分都循环相加,看是不是最小周期。里面判断最小周期时和字符串无周期时,用了两个小技巧。
#includeusing namespace std;vector 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