这道题是最小表示法的裸题
你不知道最小表示法?赶紧戳这里
看完你就会写了
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000005;
char a[maxn],b[maxn];
//int n;
int getmin(char* c){
int n=strlen(c);
int i=0,k=0;
int j=1;
while(i<n&&j<n){
if(c[i]<c[j]){
j++;
}else if(c[i]>c[j]){
i=j++;
}else{
for(k=1;k<n;k++){
if(c[(i+k)%n]<c[(j+k)%n]){
j=(j+k+1);
break;
}else if(c[(i+k)%n]>c[(j+k)%n]){
i=j;
j=(j+k+1);
break;
}
}
}
}
return min(i,j);
}
int main(){
scanf("%s%s",a,b);
int aa=getmin(a);
int bb=getmin(b);
int n=strlen(a);
for(int i=0;i<n;i++){
if(a[(aa+i)%n]!=b[(bb+i)%n]){
printf("No");
return 0;
}
}
printf("Yes\n");
for(int i=0;i<n;i++){
printf("%c",a[(aa+i)%n]);
}
return 0;
}