BZOJ 2176: Strange string 最小表示法

来源:互联网 发布:赌球外围软件 编辑:程序博客网 时间:2024/06/05 16:18

2176: Strange string

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 375  Solved: 153
[Submit][Status][Discuss]

Description

给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.

Input

读入两行, 第一行为n, 第二行为字符串S.

Output

将”奇怪的字串” T输出输入样例

Sample Input

10
asdfasdfas

Sample Output

asasdfasdf

HINT

数据范围

对于100%的数据, 保证n≤10000000;

给定的字符串中的字符保证在#33 ~ #254之间.


最小表示法,加unsigned char 

空间开二倍比%运算不知快到哪里去。。


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<map>#include<set>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=10*x+ch-'0';ch=getchar();}return x*f;}inline void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=10000100;unsigned char s[N<<1];int main(){int n=read();scanf("%s",s+1);for(int i=1;i<=n;i++)s[i+n]=s[i];int k=0,i=1,j=2;while(k<=n&&j<=n&&i<=n){int t=s[i+k]-s[j+k];if(!t)k++;else{if(t<0)j+=k+1;else i+=k+1;k=0;if(i==j)i++;}}int ans=min(i,j);for(int i=0;i<n;++i)putchar(s[ans+i]);puts("");return 0;}/*10asdfasdfasasasdfasdf*/


原创粉丝点击