BZOJ 1398 Vijos1382寻找主人 Necklace (最小表示法)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1398

 


 

 

题目:

Description

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

Input

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

Output

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

Sample Input

2234342423
2423223434

Sample Output

Yes
2234342423
 
 

 
 
思路:
最小表达法裸题
 

 
代码:
#include <bits/stdc++.h>

using namespace std;
const int maxn=1e6+10;
char a[maxn],b[maxn];

int getmin(char *s,int n){
    int i=0,j=1,k=0,t;
    while(i<n && j<n && k<n){
        t=s[(i+k)%n]-s[(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;
}

int main(){
    scanf("%s",a);
    scanf("%s",b);
    int len=strlen(a);
    int k1=getmin(a,len);
    int k2=getmin(b,len);
    string s1="",s2="";
    for(int i=0;i<len;i++){
        s1+=a[(k1+i)%len];
        s2+=b[(k2+i)%len];
    }
    if(s1==s2){
        printf("Yes\n");
        cout<<s1<<endl;
    }
    else printf("No\n");
    return 0;
} 

 

 
 
 
 
 
posted @ 2019-08-08 23:34  周园顾  阅读(229)  评论(0编辑  收藏  举报