zoukankan      html  css  js  c++  java
  • HDU4333

    传送门: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;
    }
  • 相关阅读:
    函数指针与变长参数列表
    Finding intersection and union of two sets.
    依赖注入
    可达性分析算法
    java 虚拟机栈
    Java 堆
    java虚拟机>>程序计数器
    Java方法区(Method Area)
    Java 运行时常量池
    java引用
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7326877.html
Copyright © 2011-2022 走看看