标签:
先用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