bzoj 2176 Strange string
Description
给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.
Input
读入两行, 第一行为n, 第二行为字符串S.
Output
将”奇怪的字串” T输出输入样例
Sample Input
10
asdfasdfas
asdfasdfas
Sample Output
asasdfasdf
HINT
数据范围
对于100%的数据, 保证n≤10000000;
给定的字符串中的字符保证在#33 ~ #254之间.
这题只能用最小表示法$O(n)$的做法了,用后缀自动机就空间就炸了。
注意定义为unsigned char 类型,否则无法输入。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=10000000+10; 4 unsigned char s[N]; 5 int n; 6 int solve(){ 7 int i=0,j=1,k=0; 8 while (i<n && j<n && k<n){ 9 int x=s[(i+k)%n]-s[(j+k)%n]; 10 if(!x) k++; 11 else { 12 if(x>0) i=max(i+k+1,j+1); 13 else j=max(j+k+1,i+1); 14 k=0; 15 } 16 } 17 return min(i,j); 18 } 19 int main(){ 20 scanf("%d",&n); 21 scanf("%s",s); 22 int t=solve(); 23 for(int i=0;i<n;i++) 24 putchar(s[(i+t)%n]); 25 return 0; 26 }