题目链接: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<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std; const int N=1e6+;
int n;
int exp(char ch[])
{
int i=,j=,k;
while (i<=n&&j<=n)
{
for (k=;k<=n&&ch[i+k]==ch[j+k];k++);
if (k==n) break;
if (ch[i+k]>ch[j+k])
{
i=i+k+;
if (i==j) i++;
}
else
{
j=j+k+;
if (i==j) j++;
}
}
return min(i,j);
}
int main()
{
char ch1[N],ch2[N];
scanf("%s",ch1+);
scanf("%s",ch2+);
n=strlen(ch1+);
for (int i=;i<=n;i++) ch1[i+n]=ch1[i];
for (int i=;i<=n;i++) ch2[i+n]=ch2[i];
int x=exp(ch1);
int y=exp(ch2);
bool flag=true;
for (int i=;i<n;i++)
{
if (ch1[x+i]!=ch2[y+i])
{
flag=false;
break;
}
}
if (!flag)
{
puts("No");
return ;
}
puts("Yes");
for (int i=;i<n;i++)
{
printf("%c",ch1[x+i]);
}
return ;
}

最新文章

  1. Spring整合JUnit框架进行单元测试代码使用详解
  2. 【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
  3. wpf,图片灰化处理
  4. DEDECMS中直接通过数据库插入文章
  5. Qt之QLineEdit
  6. eclipse中本地项目怎么和svn中的项目关联?
  7. Working with Sprites
  8. gdb在运行maintenance info program-spaces命令时coredump
  9. android中控件的使用
  10. java I/O之装饰者模式
  11. window.open() | close()方法
  12. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2
  13. filestream streamreader
  14. 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
  15. ContentType是否大小写区分?
  16. bugku 逆向 love
  17. 使用fiddler修改支付金额,支付必测
  18. http响应头里没有或者有content-length的几种可能性
  19. BZOJ4012 HNOI2015开店(树链剖分+主席树)
  20. python 线程 event

热门文章

  1. php面向对象之构造函数和析构函数
  2. php匿名函数和可变参数函数
  3. 一个Python项目的创建架构
  4. springboot的常见配置
  5. 401 - Unauthorized: Access is denied due to invalid credentials.
  6. UVa 11729 Commando War 【贪心】
  7. ZBrush破解版下载,ZBrush中文版下载
  8. Hihocoder1061-Beautiful String
  9. LeetCode Golang 8. 字符串转换整数 (atoi)
  10. HDU 1576 A/B( 逆元水 )