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()); }