习题3-4 Periodic Strings UVA - 455

这个题看着很简单,但是卡了我好几个点。

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;
}
posted @ 2018-09-12 22:24  CF过2100就买ARCTERYX  阅读(101)  评论(0编辑  收藏  举报