标签:
给定长度为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("\n"); 29 return 0; 30 }
杂项(最小表示法):HZOI 2015 Glass Beads
标签:
原文地址:http://www.cnblogs.com/TenderRun/p/5801473.html