【题目描述】
给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示。
【输入格式】
第一行是串的长度,第二行是字符串。
【输出格式】
串的最小表示。
【样例输入】
10
helloworld
【样例输出】
dhelloworl
【题目来源】
HZOI2015 改编自poj1509
算法很显然,需要注意的是:s[len+1]要赋值成一个较大值。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=300010; 6 char s[maxn];int len; 7 int main(){ 8 freopen("MinRepresentations.in","r",stdin); 9 freopen("MinRepresentations.out","w",stdout); 10 scanf("%d%s",&len,s+1); 11 int p1=1,p2=2,k;s[len+1]='z'+1; 12 while(p1<=len&&p2<=len){k=0; 13 while(s[p1+k]==s[p2+k])++k; 14 if(s[p1+k]<s[p2+k]){ 15 p2=p2+k+1; 16 p2+=p1==p2; 17 } 18 else{ 19 p1=p1+k+1; 20 p1+=p1==p2; 21 } 22 } 23 p1=p1<=len?p1:p2; 24 for(int i=p1;i<=len;i++) 25 putchar(s[i]); 26 for(int i=1;i<p1;i++) 27 putchar(s[i]); 28 printf(" "); 29 return 0; 30 }