给定两个项链的表示,判断他们是否可能是一条项链。
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;
}