2176: Strange string
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 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
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;
}
/*
10
asdfasdfas
asasdfasdf
*/