tjut 4333

来源:互联网 发布:天刀捏脸数据 女 冰儿 编辑:程序博客网 时间:2024/06/05 07:30
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#define INF 999999999using namespace std;const int MAX=100000+10;char s[MAX*2];int nxt[MAX];void get_next(char *a,int len){    int i=-1,j=0;    nxt[0]=-1;    while(j<len){        if(i == -1 || a[i] == a[j])nxt[++j]=++i;        else i=nxt[i];    }}void get_extend(char *a,int len){    int k=0,i=1;    nxt[0]=len;    while(k+1<len && a[k] == a[k+1])++k;    nxt[1]=k;    k=1;    while(++i<len/2){//只需要求到原串的长度即可        int maxr=k+nxt[k]-1;        nxt[i]=min(nxt[i-k],max(maxr-i+1,0));        while(i+nxt[i]<len && a[nxt[i]] == a[i+nxt[i]])++nxt[i];        if(i+nxt[i]>k+nxt[k])k=i;    }}int main(){    int t,num=0;    cin>>t;    while(t--){        scanf("%s",s);        int len=strlen(s);        get_next(s,len);        int temp=len%(len-nxt[len]) == 0?len/(len-nxt[len]):1;//求循环节循环了几次        for(int i=0;i<=len;++i)s[i+len]=s[i];        get_extend(s,len+len);        int a=0,b=0,c=0;        for(int i=0;i<len;++i){            if(nxt[i]>=len)++b;//表示等于原串的            else if(s[nxt[i]]<s[i+nxt[i]])++c;//表示大于原串的            else ++a;//表示小于原串的        }        cout<<"Case "<<++num<<": "<<a/temp<<' '<<b/temp<<' '<<c/temp<<endl;    }    return 0;}

0 0
原创粉丝点击