给定两个项链的表示,判断他们是否可能是一条项链。
Input
输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。
Output
如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’
第二行输出该项链的字典序最小的表示。 设L = 项链长度,L <= 1000000。
Sample Input
2234342423
2423223434
Sample Output
Yes
2234342423
//BZOJ 1398
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
char s1[maxn], s2[maxn];
int len, a, b;
int cal(char *s, int l){
int i = 0, j = 1, k = 0, f;
while(i < l && j < l && k < l){
f = s[(i+k)%l] - s[(j+k)%l];
if(!f) k++;
else{
if(f>0) i=i+k+1;
else j=j+k+1;
if(i==j) i++;
k=0;
}
}
return min(i,j);
}
int main()
{
scanf("%s%s", s1, s2);
len = strlen(s1);
int a = cal(s1, len);
int b = cal(s2, len);
for(int i = 0; i < len; i++){
if(s1[(a+i)%len]!=s2[(b+i)%len]){
printf("No\n");
return 0;
}
}
printf("Yes\n");
for(int i=0; i<len; i++){
printf("%c", s1[(a+i)%len]);
}
return 0;
}