vijos1382寻找主人
题目大意:
给出两个串(长度<=1e6),问是否同构,如果同构输出最小表示。
题解:
这是最小表示法模板题。在这里好好讲一下最小表示法。
首先有一个最暴力的方法:
把所有表示搞出来排序。
时间复杂度O(n^2logn);
然后可以发现,比较两个字符串时都是从第一位向后比。
伪代码:
char s[N<<];
int mex()
{
scanf("%s",s+);
int len = strlen(s+);
for(int i=;i<=len;i++)
s[i+len]=s[i];
int i=,j=,k=;
while(i<=len&&j<=len&&k<len)
{
int t = s[i+k]-s[j+k];
if(!t)k++;
else
{
if(t>)i++;
else j++;
k=;
if(i==j)i++;
}
}
return i<j?i:j;
}
时间复杂度O(n^2);
看起来可以再优化一下。
比如当前串是
S1S2S3S4S5S6S7S8
指针i,j分别走到S1和S5。
k=2。
这时S1S2和S5S6相同。
然后比较S3和S7。假设S3>S7,那么i直接跳过S3到达S4。
因为如果要作开头的话,S1不如S5,S2不如S6,S3不如S7;
公共原因:S3<S7。
因此模板:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1000050
char a[][*N];
int len;
int mex(int t)
{
int i=,j=,k=;
while(i<=len&&j<=len&&k<len)
{
int tmp = a[t][i+k]-a[t][j+k];
if(!tmp)k++;
else
{
if(tmp>)i+=k+;
else j+=k+;
if(i==j)j++;
k=;
}
}
return i<j?i:j;
}
int main()
{
scanf("%s%s",a[]+,a[]+);
len = strlen(a[]+);
for(int i=;i<=len;i++)a[][len+i]=a[][i],a[][len+i]=a[][i];
int l1 = mex(),l2 = mex();
for(int i=;i<len;i++)
if(a[][l1+i]!=a[][l2+i])
{
printf("No\n");
return ;
}
printf("Yes\n");
for(int i=;i<len;i++)
printf("%c",a[][l1+i]);
printf("\n");
return ;
}
vijos1382寻找主人的更多相关文章
- 【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)
1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 308 Solved: 129 Descrip ...
- BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法
Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...
- 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace
把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...
- vijos-1382 寻找主人
题意: 给出两个同样长度的数字串: 求两个串是否本质同样.同样则输出最小表示. 长度L似乎给的不正确,大概是2000000左右吧: 题解: 最小表示法裸题.证明正确性啥的详见论文吧: 这东西大体的思路 ...
- [bzoj 1398] Vijos1382寻找主人 Necklace 解题报告(最小表示法)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1398 题目: Description 给定两个项链的表示,判断他们是否可能是一条项链. ...
- 【bzoj1398】Vijos1382寻找主人 Necklace
*题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...
- BZOJ 1398: Vijos1382寻找主人 Necklace(最小表示法)
传送门 解题思路 最小表示法.首先对于判断是不是循环同构的串,直接扫一遍用哈希判即可.然后要输出字典序最小的就要用到最小表示法,首先可以把串复制一遍,这样的话就可以把串变成静态操作.如果对于两个位置\ ...
- BZOJ1398Vijos1382寻找主人 Necklace——最小表示法
题目描述 给定两个项链的表示,判断他们是否可能是一条项链. 输入 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). 输出 如果两条项链不可能同构,那么输出 ...
- bzoj 1398: 寻找主人 AC自动机+最小表示法
题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...
随机推荐
- log4j的1.2.15版本,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......
在动态网站工程中,添加了Pom依赖,当添加log4j的1.2.15版本依赖时,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:ja ...
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
一棵根为1 的树,每条边上有一个字符(a-v共22种). 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树中最长的Dokhtar-kosh路 ...
- 超短的判断IE javascript代码
首先说明该代码只能在IE 6~8中有效,再高级的IE已经修复这个BUG <script type=’text/javascript’> var ie = !-[1,]; alert(ie) ...
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...
- JDK与JRE、JVM三者间的关系及JDK的安装部署
JDK与JRE.JVM三者间的关系及JDK的安装部署 一.JDK与JRE.JVM三者间的关系 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了 ...
- LoadRunner12学习之路(1-5)
本次LoadRunner12学习用户指南,学习周期预计3天,每天学习1-2单元内容! 2017.12.17 一.使用HPE Web Tours示例应用程序 本教程使用 HPE Web Tours(一个 ...
- Triangular Pastures POJ - 1948
Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么a ...
- 区间DP UVA 10453 Make Palindrome
题目传送门 /* 题意:问最少插入多少个字符使得字符串变成回文串 区间DP:dp[i][j]表示[l, r]的字符串要成为回文需要插入几个字符串,那么dp[l][r] = dp[l+1][r-1]; ...
- 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作
微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...
- 转 ORA-00054 的解决方法
统有一个不用的索引,想删除这个索引, SQL> drop index GPSTIME_GLOBAL_INDEX 2 /drop index GPSTIME_GLOBAL_INDEX ...