循环节

循环节

题目描述

第一节是英语课。今天,老师又教了桐桐很多单词。桐桐发现所有单词都有循环节(大写字母一律化成小写字母)。如a(循环长度为1,循环节为a),luLul(循环长度为2,循环节为lu),OlyMPic(循环长度为7,循环节为olympic),CcCcccc(循环长度为1,循环节为c),等等。
而且,桐桐发现这能加速她背单词。她上课和ROBIN说了话,老师罚她背单词。虽然就一个,但长度实在太大,单词大小写可以不管,求桐桐需要记多长的最小循环节,并把这个单词的最小循环节输出来(最后一个循环节可以没完)。

输入

1行,是一个单词,其中不一定只出现小写字母,并且长度小于101000。

输出

2行,第1行输出循环长度,第2行输出循环节(全部输出小写字母)。

样例输入

erEreR
OlyMpic

样例输出

2
er
7
olympic

提示


30%的数据满足:字符串长度≤255,字符串中均为小写字母;

50%的数据满足:字符串长度≤255,字符串中不一定只出现小写字母;

70%的数据满足:字符串长度≤10000,字符串中不一定只出现小写字母:

100%的数据满足:字符串长度≤101000,字符串中不一定只出现小写字母。

分析:把字符串的第一个字符出现的位置存一下,然后暴力枚举即可,卡过去了,开心(数据水?);

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <bitset>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e6+10;
const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,len1,len,coco[maxn],all;
char a[maxn],b[maxn];
bool check(int now)
{
 
    for(int i=len1;i<now;i++)b[i]=a[i];
    len1=now;
    b[now]=0;//printf("%d %s
",now,b);
    while(strstr(a+now,b)-(a+now)==0)
        now+=len1;
    int j=0;
    for(int i=now;i<len;i++)
        if(b[j++]!=a[i])return false;
    return true;
}
int main()
{
    int i,j,k,t;
    while(~scanf("%s",a))
    {
        len=strlen(a);
        all=0;len1=0;
        rep(i,0,len-1){if(a[i]>='A'&&a[i]<='Z')a[i]=a[i]-'A'+'a';if(a[i]==a[0]&&i!=0)coco[all++]=i;}
        rep(i,0,all-1)
        {
            if(check(coco[i]))
            {
                printf("%d
%s
",len1,b);
                break;
            }
        }
        if(i==all)printf("%d
%s
",len,a);
    }
    //system ("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/5743073.html