传送门

解题思路

  最小表示法。首先对于判断是不是循环同构的串,直接扫一遍用哈希判即可。然后要输出字典序最小的就要用到最小表示法,首先可以把串复制一遍,这样的话就可以把串变成静态操作。如果对于两个位置\(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(最小表示法)的更多相关文章

  1. [bzoj 1398] Vijos1382寻找主人 Necklace 解题报告(最小表示法)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1398 题目: Description 给定两个项链的表示,判断他们是否可能是一条项链. ...

  2. 【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)

    1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 129 Descrip ...

  3. BZOJ1398Vijos1382寻找主人 Necklace——最小表示法

    题目描述 给定两个项链的表示,判断他们是否可能是一条项链. 输入 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). 输出 如果两条项链不可能同构,那么输出 ...

  4. BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法

    Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...

  5. 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace

    把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...

  6. 【bzoj1398】Vijos1382寻找主人 Necklace

    *题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...

  7. vijos1382寻找主人

    题目大意: 给出两个串(长度<=1e6),问是否同构,如果同构输出最小表示. 题解: 这是最小表示法模板题.在这里好好讲一下最小表示法. 首先有一个最暴力的方法:把所有表示搞出来排序. 时间复杂 ...

  8. vijos-1382 寻找主人

    题意: 给出两个同样长度的数字串: 求两个串是否本质同样.同样则输出最小表示. 长度L似乎给的不正确,大概是2000000左右吧: 题解: 最小表示法裸题.证明正确性啥的详见论文吧: 这东西大体的思路 ...

  9. bzoj 1398: 寻找主人 AC自动机+最小表示法

    题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...

随机推荐

  1. 2018-10-31-WPF-在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待

    title author date CreateTime categories WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 lindexi 2018-10-31 9:30:9 + ...

  2. 数据转换--替换值(replace函数)

    替换值 replace函数 data=Series([1,-999,2,-999,-1000,3]) data Out[34]: 0 1 1 -999 2 2 3 -999 4 -1000 5 3 d ...

  3. 格式化抽象本地地址(实战linux socket编程)

    格式化抽象本地地址传统AF_UNIX套接口名字的麻烦之一就在于总是调用文件系统对象.这不是必须的,而且也不方便.如果原始的文件系统对象并没有删除,而在bind调用时使用相同的文件名,名字赋值就会失败. ...

  4. lib 和 dll 的区别、生成以及使用详解 ~~包含示例代码~~(转)

    原文章地址:https://www.cnblogs.com/TenosDoIt/p/3203137.html#c 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方 ...

  5. ES6 简化对象写法

    简化的对象写法 * 省略同名的属性值 * 省略方法的function <!DOCTYPE html> <html lang="en"> <head&g ...

  6. JavaScript ---- 原型,原型链(什么是原型)

    和“闭包”一样,“原型”这个概念也经常被提起. 其实这个“概念”应该和构造函数,对象放在一起讲,但是由于时间关系,先把这部分抽取出来讲.再讲这个概念时我们先大致了解下JavaScript中的“对象”. ...

  7. Android Activity XML配置

    <activity android:name="xxxActivity" android:configChanges="keyboard|keyboardHidde ...

  8. 如何理解Vue的render函数

    第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> < ...

  9. Unity NGUI 多个UIPanel对粒子的剪裁

    之前写过一篇单个 UIPanel 对粒子的裁剪,地址是:https://www.cnblogs.com/jietian331/p/5075487.html 但项目中有时会遇到多个UIPanel,如下面 ...

  10. springDataJpa的官方API

    一 .  Core concepts(核心概念) 1.springdata中的中心接口是——Repository.这个接口没有什么重要的功能(原句称没什么惊喜的一个接口).主要的作用就是标记和管理.其 ...