bzoj1398 寻找主人

来源:互联网 发布:关于编程的书 编辑:程序博客网 时间:2024/03/29 20:33

Description

 给定两个项链的表示,判断他们是否可能是一条项链。

Input

输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。

Output

如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’,第二行输出该项链的字典序最小的表示。 设L = 项链长度, 对于50%的数据L <= 100000; 对于100%的数据L <= 1000000。

找出两条项链的最小表示法。然后比较。
manacher。。。。。

#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>using namespace std;int zxbsf(char *a){int i = 0,j = 1, k = 0; int n = strlen(a);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) i ++;k = 0;}}return min(i,j);}int main(){char a[1000010],b[1000010];scanf("%s%s",a,b);int x = zxbsf(a);int y = zxbsf(b);int n = strlen(a);for(int i = 0; i < n; i ++)if(a[(x + i) % n] != b[(y + i) % n]){printf("No");return 0;}printf("Yes\n");for(int i = 0; i < n; i ++)printf("%c",a[(x + i) % n]);return 0;}


0 0