杂项(最小表示法):HZOI 2015 Glass Beads

【题目描述】

给定长度为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 }
原文地址:https://www.cnblogs.com/TenderRun/p/5801473.html