• 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;        
        }    
    }
  • 相关阅读:
    关于DotNETStruts
    SQL语句导入导出大全
    一个打印Dataset的.net的打印类
    遍历指定文件夹下所有的文件
    SQL Server SQL导入导出语句
    查看OCX的属性和方法的脚本
    关于写文本文件的问题
    新钶信息系统面试
    【POJ1208】The Blocks Problem
    【POJ1363】Rails
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11251875.html
Copyright © 2020-2023  润新知