【模板】最小表示(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;
}

posted @ 2018-10-25 15:01  Starryskies  阅读(199)  评论(0编辑  收藏  举报