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
2423223434
Sample Output
Yes
2234342423
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; }