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

forever97 posted @ 2016年9月20日 19:17 in 字符串-最小最大表示法 with tags 最小最大表示法 KMP , 566 阅读

 

【题目链接】 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\n",mi+1,ans,mx+1,ans);
    }return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter