• HDU 3374 String Problem (KMP+最小最大表示)


    【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=3374

     

    【题目大意】

      给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量。

    【题解】

      最小最大表示可以用最小最大表示法解决,数量则可以发现就是该字符串的循环节,可以用nxt数组求解。

    【代码】

    #include <cstring>
    #include <cstdio>
    #include <algorithm> 
    const int N=1000010; 
    using namespace std;
    int nxt[N],i,k,j,t,n,size,ans;
    char s[N];
    void get_nxt(int n,char*a){
        int i,j;
        for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){
            while(~j&&a[j+1]!=a[i])j=nxt[j];
            if(a[j+1]==a[i])j++;
        }
    }
    int min_max_express(char *s,int len,bool flag){  
        int i=0,j=1,k=0;  
        while(i<len&&j<len&&k<len){  
            int t=s[(j+k)%len]-s[(i+k)%len];  
            if(t==0)k++;  
            else{  
                if(flag){if(t>0)j+=k+1;else i+=k+1;}  
                else{if(t>0)i+=k+1;else j+=k+1;}  
                if(i==j)j++;k=0;  
            }  
        }return min(i,j);  
    }  
    int main(){
        while(~scanf("%s",s)){
            n=strlen(s);
            get_nxt(n,s);
            if(n%(n-1-nxt[n-1])==0)size=n-1-nxt[n-1];
            else size=n;
            ans=n/size;
            int mi=min_max_express(s,n,1),mx=min_max_express(s,n,0);
            printf("%d %d %d %d
    ",mi+1,ans,mx+1,ans);
        }return 0;
    }
    
  • 相关阅读:
    随笔
    梨花落(短篇小说)
    javascript中的apply,call,bind详解
    js中this的指向问题
    你若安好,便是晴天
    gulp
    图标
    normalize.css
    git bash和toritoise客户端结合使用
    云计算基础知识
  • 原文地址:https://www.cnblogs.com/forever97/p/hdu3374.html
Copyright © 2020-2023  润新知