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

假如想象 提交于 2019-11-26 14:48:27

链接: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;  } 

 

 
 
 
 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!