标签:
先用KMP问题结局循环节的问题,再用拓展kmp解决
#include<iostream> #include<string> #define maxn 200010 using namespace std; string str,b; int nextt[maxn],extend[maxn]; void get_next() { int a=0; nextt[0]=b.size(); while(a<b.size()-1&&b[a]==b[a+1]) a++; nextt[1]=a; a=1; for(int k=2;k<b.size();k++) { int p=a+nextt[a]-1; int l=nextt[k-a]; if(k-1+l>=p) { int j=p-k+1>=0? p-k+1:0; while(k+j<b.size()&&b[k+j]==b[j]) j++; nextt[k]=j; a=k; } else nextt[k]=l; } } void get_extend() { int a=0; extend[0]=str.size(); while(a<b.size()&&str[a+1]==b[a]) a++; extend[1]=a; a=1; for(int k=2;k<str.size();k++) { int p=a+extend[a]-1; int l=nextt[k-a]; if(k-1+l>=p) { int j=(p-k+1)>0? p-k+1:0; while(k+j<str.size()&&str[k+j]==b[j]&&j<b.size()) j++; extend[k]=j; a=k; } else extend[k]=l; } } int f(string m) { int mnext[m.size()+1]; mnext[0]=-1; int l=0,k=-1; while(l<m.size()) { if(m[k]==m[l]||k==-1) mnext[++l]=++k; else k=mnext[k]; } int temp=m.size()-mnext[m.size()]; if(m.size()%temp==0) return m.size()/temp; else return 1; } int main() { cin.sync_with_stdio(false); int t; cin>>t; int casee=1; while(t--) { cin>>b; str=b+b; get_next(); get_extend(); int flag=f(b); int x=0,y=0,z= 0; for(int i=0;i<b.size();i++) { if(extend[i]>=b.size()) y++; else { if(str[i+extend[i]]<b[extend[i]]) x++; else z++; } } cout<<"Case "<<casee++<<": "<<x/flag<<" "<<y/flag<<" "<<z/flag<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/47809389