最小表示法--Zju1729 Hidden Password
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
char s[200010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d %s",&n,s+1);
for(int i=1;i<n;i++)s[i+n]=s[i];
int i=1,j=2;//指向两个不同的位置
for(int k=0;k<=n&&i<=n&&j<=n;)
{
if(s[i+k]==s[j+k]) //向后移动
k++;
else
{
if(s[i+k]>s[j+k]) //从i到i+k这段都不可能是最小表示
i=i+k+1;
else
j=j+k+1;
if(i==j) //i,j应互不相同
j++;
k=0;
}
}
printf("%d\n",min(i,j)-1);
}
return 0;
}

浙公网安备 33010602011771号