题意
判断两个串是否循环同构。
分析
首先是可以用最小表示法来判断同构,简单地写一写
首先定义三个值,i,j,k分别是两个头和当前扫到的长度
如果相等就k++,不相等就i+=k+1,或者j+=k+1(大的加)
然后还有可能i=j的时候要手动错开
最后返回小的指针(也就是在串里面的指针就好了)
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
struct node{int i,j,k;}; int n;
int mn(char *a)
{
int i=0,j=1,k=0;
while(i<n&&j<n&&k<n){
int t=a[(i+k)%n]-a[(j+k)%n];
if(!t) k++;
else{
if(t>0) i+=k+1;
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
char a[N],b[N];
int main(){
scanf("%s",a); scanf("%s",b); n=strlen(a);
int x=mn(a),y=mn(b); int k=0;
while(a[(x+k)%n] == b[(y+k)%n] && k<n) k++;
if(k==n){
puts("Yes");
k=0; while(k<n) printf("%c",a[(x+k)%n]),k++; printf("\n");
}
else{
puts("No");
}
return 0;
}