BZOJ 1398: Vijos1382寻找主人 Necklace(最小表示法)
解题思路
最小表示法。首先对于判断是不是循环同构的串,直接扫一遍用哈希判即可。然后要输出字典序最小的就要用到最小表示法,首先可以把串复制一遍,这样的话就可以把串变成静态操作。如果对于两个位置\(i,j\),若他们\(i\sim i+k-1\)与\(j\sim j+k-1\)这些位置都两两相等,而\(s[i+k]<s[j+k]\)的话。那么首先可以知道的是\(j\)这个位置一定不是最小表示的开头,还有一个性质就是\(j\sim j+k\)这些位置也一定不是,因为\(s[i+k]<s[j+k]\),那么这些位置也一定有一个对应的\(i_0\),使得他们在\(i+k\)的位置依然不相等。所以用一个双指针扫,时间复杂度\(O(n)\)。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int MAXN = 1000005;
const int base = 666623333;
typedef unsigned long long ULL;
char s1[MAXN],s2[MAXN];
ULL hsh1[MAXN<<1],hsh2[MAXN],poww[MAXN<<1];
int ans,n;
bool flag;
inline bool check(int x){
return (hsh1[x+n-1]-hsh1[x-1]*poww[n])==(hsh2[n]-poww[n])?1:0;
}
int main(){
scanf("%s%s",s1+1,s2+1);
n=strlen(s1+1);
for(int i=1;i<=n;i++) s1[i+n]=s1[i];hsh1[0]=hsh2[0]=1;poww[0]=1;
for(int i=1;i<=(n<<1);i++) {hsh1[i]=hsh1[i-1]*base+s1[i]-'0'+1;poww[i]=poww[i-1]*base;}
for(int i=1;i<=n;i++) hsh2[i]=hsh2[i-1]*base+s2[i]-'0'+1;
for(int i=1;i<=n;i++) if(check(i)) {flag=1;break;}
if(!flag) {puts("No");return 0;}
puts("Yes");int l=1,r=2,k;
while(l<=n && r<=n) {
for(k=0;s1[l+k]==s1[r+k] && k<=n;k++);
if(k==n) break;
if(s1[l+k]<s1[r+k]) {r=r+k+1;r+=(r==l);}
else {l=l+k+1;l+=(l==r);}
}
ans=min(l,r);
for(int i=ans;i<=ans+n-1;i++) putchar(s1[i]);putchar('\n');
return 0;
}
BZOJ 1398: Vijos1382寻找主人 Necklace(最小表示法)的更多相关文章
- [bzoj 1398] Vijos1382寻找主人 Necklace 解题报告(最小表示法)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1398 题目: Description 给定两个项链的表示,判断他们是否可能是一条项链. ...
- 【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)
1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 308 Solved: 129 Descrip ...
- BZOJ1398Vijos1382寻找主人 Necklace——最小表示法
题目描述 给定两个项链的表示,判断他们是否可能是一条项链. 输入 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). 输出 如果两条项链不可能同构,那么输出 ...
- BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法
Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...
- 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace
把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...
- 【bzoj1398】Vijos1382寻找主人 Necklace
*题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...
- vijos1382寻找主人
题目大意: 给出两个串(长度<=1e6),问是否同构,如果同构输出最小表示. 题解: 这是最小表示法模板题.在这里好好讲一下最小表示法. 首先有一个最暴力的方法:把所有表示搞出来排序. 时间复杂 ...
- vijos-1382 寻找主人
题意: 给出两个同样长度的数字串: 求两个串是否本质同样.同样则输出最小表示. 长度L似乎给的不正确,大概是2000000左右吧: 题解: 最小表示法裸题.证明正确性啥的详见论文吧: 这东西大体的思路 ...
- bzoj 1398: 寻找主人 AC自动机+最小表示法
题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...
随机推荐
- element ui设置表格表头高度和每一行的高度
填坑记录:今天用element ui的表格组件做用户信息展示,直接拉取的官网的代码过来,发现表头和每一行都太高了,如下: 因为第一次使用element ui的表格组件,不太清楚会遇到这样的坑,以为能轻 ...
- 搭建一个node.js项目
初始化项目 新建一个文件夹,运行 npm init 初始化项目 mkdir okadaGo cd okadaGo npm init 按照提示输入一些项目的相关信息 D:\web\node>mkd ...
- C#编程入门--MYSQLHELPER
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 了解GTIN小记
GTIN为条形码,即"全球贸易项目代码"(Global Trade Item Number ) GTIN用作识别商品品项的全球性独一编码,是编码系统中应用最广泛的标识代码. GTI ...
- TTreeView、TTreeNodes和TTreeNode
TreeView是Delphi中使用频率比较高的一个控件,虽然使用次数很多,但总结不够.借着这次做GDW原型的机会总结一下,写的过程中也会参考网上的博文. TTreeView.TTreeNodes和T ...
- Core Text 入门
本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...
- 漏洞验证系列--MongoDB未授权访问
本系列文章旨在对于有一定网络安全基础的人员,在日常工作中扫描出来的各种漏洞,如何进行验证,以区分该漏洞是否存在或是扫描器误报.请勿应用非法途径. 本漏洞是由于MongoDB未设置访问权限,用户可以直接 ...
- java进行微信h5支付开发
最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...
- BAT大神推荐:看懂英文文档,每天只需要10分钟做这件事……
程序员这个行业是很特殊的.之所以说特殊,就是因为它所有的技术大多来自欧美,所以最主流,最新鲜,最正确的技术文章都是英文,遗憾的是,大部分还没有译本. 有些译文还比较差.与其等待别人的翻译,不如直接阅读 ...
- Python服务端工程师就业面试指导✍✍✍
Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...