您的位置:首页 > 其它

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

2016-08-24 08:24 211 查看

【题目描述】

给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示。

【输入格式】

第一行是串的长度,第二行是字符串。

【输出格式】

串的最小表示。

【样例输入】

10

helloworld


【样例输出】

dhelloworl


【题目来源】

HZOI2015 改编自poj1509

  算法很显然,需要注意的是:s[len+1]要赋值成一个较大值。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=300010;
char s[maxn];int len;
int main(){
freopen("MinRepresentations.in","r",stdin);
freopen("MinRepresentations.out","w",stdout);
scanf("%d%s",&len,s+1);
int p1=1,p2=2,k;s[len+1]='z'+1;
while(p1<=len&&p2<=len){k=0;
while(s[p1+k]==s[p2+k])++k;
if(s[p1+k]<s[p2+k]){
p2=p2+k+1;
p2+=p1==p2;
}
else{
p1=p1+k+1;
p1+=p1==p2;
}
}
p1=p1<=len?p1:p2;
for(int i=p1;i<=len;i++)
putchar(s[i]);
for(int i=1;i<p1;i++)
putchar(s[i]);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: