传送门:HDU4333
扩展KMP小应用,把原串复制一遍即可了。
对着某位博主的代码,死活改不出来。然后发现这货的代码是WA的……
代码上的`小细节见下。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int ext[2000005];
int pre[2000005];
char S[2000005];
int n,length;
void Build_ext(const char *T,int* ext){
int len=strlen(T),a=0,p=0;
ext[0]=len;
while(p<len-1&&T[p]==T[p+1])
p++;
ext[1]=p;
a=1;
for(int k=2;k<len;k++){
if(ext[k-a]+k-1>=p){
int j =max((p-k+1),0);
while(k+j<len&&T[k+j]==T[j])
j++;
ext[k]=j;
a=k;
p=k+j-1;
}
else
ext[k]=ext[k-a];
}
}
void KMP(char* S,int len)
{
pre[0]=-1;int k=-1;
for(int i=1;i<len;i++){
while(k>=0&&S[k+1]!=S[i])
k=pre[k];
if(S[k+1]==S[i])
k++;
pre[i]=k;
}
}
void GetAns(int number)
{
Build_ext(S,ext);
int ans1=0,ans2=0,ans3=0;
for(int i=1;i<=length;i++)
if(ext[i]>=length)
ans2++;
else
if(S[i+ext[i]]>S[ext[i]])
ans3++;
else
ans1++;
KMP(S,strlen(S));
int tmp=length%(length-pre[length])==0?max(length/(length-pre[length]),1):1;
printf("Case %d: %d %d %d
",number,ans1/tmp,ans2/tmp,ans3/tmp);
}
void Readdata()
{
freopen("loli.in","r",stdin);
ios::sync_with_stdio(false);
cin>>n;
}
void Solve()
{
for(int i=1;i<=n;i++){
cin>>S;
length=strlen(S);
for(int j=0;j<length;j++)
S[j+length]=S[j];
S[2*length]=' ';
GetAns(i);
}
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
Solve();
Close();
return 0;
}