题意
给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.
n<=10000000
分析
这题貌似还可以用SA或SAM来做,但是10000000就肯定爆炸啦~~
所以就去学了一发字符串循环同构的最小表示法。
还有这题要用unsigned char,我也不知道为毛
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 10000005
using namespace std;
int n;
unsigned char s[N*2];
int main()
{
freopen("2176.in","r",stdin);//freopen("test.out","w",stdout);
scanf("%d",&n);
scanf("%s",s+1);
for (int i=n+1;i<=n*2;i++)
s[i]=s[i-n];
int i=1,j=2;
while (i<n&&j<n)
{
int k=0;
while (s[i+k]==s[j+k]&&k<n) k++;
if (k==n) break;
if (s[i+k]<s[j+k]) j=max(j+k+1,i+1);
else i=max(i+k+1,j+1);
}
i=min(i,j);
for (int k=1;k<=n;k++)
putchar(s[k+i-1]);
return 0;
}