首页 > 其他 > 详细

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

时间:2019-07-26 18:56:51      阅读:113      评论:0      收藏:0      [点我收藏+]

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

思路:循环移动匹配字典序最大,或者循环截取  (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;        
    }    
}

 

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

原文:https://www.cnblogs.com/Tianwell/p/11251875.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!