题目
Input
3
123
Output
Yes
Input
4
2214
Output
No
题意:给出一个数n再给出一个字符串,求这个串是否为他的最小同构字符串,是的话输出Yes否则输出No
思路:模板题,直接套最小表示法的模板
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int n;
char a[600000],b[600000];
solve(char *s)//模板
{
int i=0,j=1,l;
int len=strlen(s);
while(i<len&&j<len)
{
for(l=0;l<len;l++)
if(s[(i+l)%len]!=s[(j+l)%len])break;
if(l>=len)break;
if(s[(i+l)%len]>s[(j+l)%len])
{
if(i+l+1>j)i=i+l+1;
else i=j+1;
}
else if(j+l+1>i)j=j+l+1;
else j=i+1;
}
return i<j?i:j;
}
int main()
{
cin>>n;
cin>>a;
int x=solve(a);
for(int i=0;i<n;i++)
b[i]=a[(i+x)%n];
int flag=1;
for(int i=0;i<n;i++)
if(a[i]!=b[i])
{
flag=0;
break;
}
if(flag)
{
printf("Yes\n");
//printf("%s\n",a);
}
else printf("No\n");
//printf(" %s ",b);
}