HDU-3374 String Problem (最小最大表示法)

题意:给定一个字符串,循环移动找到最小(大)字典序下标,以及该串的循环节个数。

思路:循环移动匹配字典序最大,或者循环截取  (TLE). 最后还是投降去看了别人的题解... 然后就是一道 字符串中循环的最小(大)的表示法 题。然后关于循环节个数当然就用next数组来求

 

完整代码:

#include<iostream>
#include<set>
#include<map>
#include<vector>
#include<string>
#include <cstring> 
#include<algorithm>
using namespace std;
const int maxn = 1e6+9;
int nex[maxn];
int len ; 
string s;
void getnext(){
    int i = 0,j=-1;
    nex[i] = j;
    while(i<len){
        if(j==-1||s[i]==s[j]){
            nex[++i] = ++j;
        }else j = nex[j];
    }
}
int getM(int 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(cin>>s){
        len = s.size();
        int ans,ansmax,ansmin;
        getnext(); 
        ansmax = getM(0)+1;
        ansmin = getM(1)+1;
        //有循环节就输出循环节个数,否则输出1 
        if(!(len%(len-nex[len]))){
            ans = len/(len-nex[len]);
        }else ans = 1;
        
        cout<<ansmin<<" "<<ans<<" "<<ansmax<<" "<<ans<<endl;        
    }    
}

 

posted @ 2019-07-26 17:41  Tianwell  阅读(201)  评论(0编辑  收藏  举报