• HDU


    Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings: 
    String Rank 
    SKYLONG 1 
    KYLONGS 2 
    YLONGSK 3 
    LONGSKY 4 
    ONGSKYL 5 
    NGSKYLO 6 
    GSKYLON 7 
    and lexicographically first of them is GSKYLON, lexicographically last is YLONGSK, both of them appear only once. 
      Your task is easy, calculate the lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), its times, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also. 

    Input  Each line contains one line the string S with length N (N <= 1000000) formed by lower case letters.OutputOutput four integers separated by one space, lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), the string’s times in the N generated strings, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.Sample Input

    abcder
    aaaaaa
    ababab

    Sample Output

    1 1 6 1
    1 6 1 6
    1 3 2 3
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1000010;
    char a[maxn]; int Next[maxn],num,L;
    void KMP()
    {
        for(int i=2,j=0;i<=L;i++){
            while(j&&a[i]!=a[j+1]) j=Next[j];
            if(a[i]==a[j+1]) j++;
            Next[i]=j;
        }
        num=L%(L-Next[L])?1:L/(L-Next[L]);
    }
    int minexpress()
    {
        int i=1,j=2,k=0;
        while(i<=L&&j<=L&&k<L){
            int ti=(i+k>L?i+k-L:i+k);
            int tj=j+k>L?j+k-L:j+k;
            if(a[ti]==a[tj]) k++;
            else {
                if(a[ti]<a[tj]) j+=k+1;
                else i+=k+1;
                if(i==j) j++;
                k=0;
            }
        }
        return min(i,j);
    }
    int maxexpress()
    {
        int i=1,j=2,k=0;
        while(i<=L&&j<=L&&k<L){
            int ti=i+k>L?i+k-L:i+k;
            int tj=j+k>L?j+k-L:j+k;
            if(a[ti]==a[tj]) k++;
            else {
                if(a[ti]>a[tj]) j+=k+1;
                else i+=k+1;
                if(i==j) j++;
                k=0;
            }
        }
        return min(i,j);
    }
    int main()
    {
        int T,Min,Max;
        while(~scanf("%s",a+1)){
            L=strlen(a+1);
            KMP();
            Min=minexpress();
            Max=maxexpress();
            printf("%d %d %d %d
    ",Min,num,Max,num);
        }
        return 0;
    }
  • 相关阅读:
    iOS万能跳转界面的方法
    CocoaPods版本更新
    iOS--开发小技巧(持续更新)
    RunTime--手势应用场景(很方便)
    牛逼的标签效果(封装好)
    直播点赞动画
    UI基础--自定义UISwitch
    StatusBar 更改状态栏颜色(ios7)
    ios版本更新提示
    IOS 两个UIImage 合成一个Image
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9722886.html
Copyright © 2020-2023  润新知