cogs 915. 隐藏口令

915. 隐藏口令

★★☆   输入文件:hidden.in   输出文件:hidden.out   简单对比
时间限制:1 s   内存限制:128 MB

USACO/hidden(译 by Felicia Crazy)

描述

有时候程序员有很奇怪的方法来隐藏他们的口令。Billy"Hacker"Geits会选择一个字符串S(由L个小写字母组成,5<=L<=100,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串。这样将得到一些字符串,他把它们排序后取出第一个字符串。把这个字符串的第一个字母在原字符串中的位置-1做为口令。

如字符串alabala,按操作的到7个字符串,排序后得:

aalabal
abalaal
alaalab
alabala
balaala
laalaba
labalaa

第一个字符串为aalabal,这个a在原字符串位置为7,7-1=6,则6为口令。

PROGRAM NAME: hidden

INPUT FORMAT

第一行:一个数:L

第二行:字符串:S

SAMPLE INPUT (file hidden.in)

7
alabala

OUTPUT FORMAT

一行,为得到的口令

 

SAMPLE OUTPUT (file hidden.out)

6 

/*
    最小表示法模板题
    字符串的最小表示法,就是对于一个字符串,可以将它的最后一位放到第一位来,依次类推,一共有n种变形,n为字符串长度 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
string s;
int getmin(){
    int i=0,j=1,k=0,t;
    while(i<n && j<n && k<n){
        t=s[(i+k)%n]-s[(j+k)%n];
        if (!t) k++;
        else{
            if (t>0) i+=k+1;
            else j+=k+1;
            if (i==j) j++;
            k=0;
        }
    }
    return i<j?i:j;
}
int main(){
    freopen("hidden.in","r",stdin);freopen("hidden.out","w",stdout);
    scanf("%d",&n);
    string w;
    while(cin>>w)s=s+w;
    printf("%d",getmin());
}

 

posted @ 2017-12-24 09:39  Echo宝贝儿  阅读(348)  评论(0编辑  收藏  举报