【模板】最小表示(POJ1509)
Description
给定\(T\)个字符串\(S\),对于每个字符串,求其最小表示
Input
第一行一个整数\(T\)
接下来T行,每行一个字符串
Output
共\(T\)行。对于每组数据,输出其最小表示的首字母的位置
Solution
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int T,ans;
char ch[300010];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%s",ch+1);
int l=strlen(ch+1);
for (int i=l+1;i<=2*l;i++) ch[i]=ch[i-l];
int i=1,j=2,k;
while (i<=l && j<=l)
{
for (k=0;k<=l && ch[i+k]==ch[j+k];k++);
if (k==l) break;
if (ch[i+k]>ch[j+k]) i=i+k+1; else j=j+k+1;
if (i==j) j++;
}
ans=min(i,j);
printf("%d\n",ans);
}
return 0;
}