[bzoj 1398] Vijos1382寻找主人 Necklace 解题报告(最小表示法)
2024-08-26 16:37:31
题目链接: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<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 ;
}
最新文章
- Spring整合JUnit框架进行单元测试代码使用详解
- 【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
- wpf,图片灰化处理
- DEDECMS中直接通过数据库插入文章
- Qt之QLineEdit
- eclipse中本地项目怎么和svn中的项目关联?
- Working with Sprites
- gdb在运行maintenance info program-spaces命令时coredump
- android中控件的使用
- java I/O之装饰者模式
- window.open() | close()方法
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2
- filestream streamreader
- 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
- ContentType是否大小写区分?
- bugku 逆向 love
- 使用fiddler修改支付金额,支付必测
- http响应头里没有或者有content-length的几种可能性
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
- python 线程 event
热门文章
- php面向对象之构造函数和析构函数
- php匿名函数和可变参数函数
- 一个Python项目的创建架构
- springboot的常见配置
- 401 - Unauthorized: Access is denied due to invalid credentials.
- UVa 11729 Commando War 【贪心】
- ZBrush破解版下载,ZBrush中文版下载
- Hihocoder1061-Beautiful String
- LeetCode Golang 8. 字符串转换整数 (atoi)
- HDU 1576 A/B( 逆元水 )