您的位置:首页 > 其它

HDU4333

2015-08-24 16:33 204 查看
传送门:HDU4333

扩展KMP小应用,把原串复制一遍就行了。

对着某位博主的代码,死活改不出来,然后发现这货的代码是WA的……

代码上的`小细节见下。

[code]#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\n",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]='\0';
        GetAns(i);
    }
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    Solve();
    Close();
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: