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 判 ...
随机推荐
- HDU 1524
思路: 算出来每个点的sg值,然后对于每个询问xor一下 //By SiriusRen #include <cstdio> #include <vector> using na ...
- 洛谷 P2062 分队问题
这题太毒了....一开始就是死活想不到,结果看了很多遍题解,重新做的时候还是做不出来.. 好像有一点被错误的题解误导了? #include<cstdio> #include<algo ...
- 解题报告:hdu 1073 Online Judge
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1073 Problem Description Ignatius is building an Onli ...
- IOS应用开发版本控制工具之Versions使用,iosversions
Versions版本控制工具破解版(Versions.zip)下载请见本博文附件.下载后在MAC安装完以后,图标是莲花状.见下图: 双击运行如下图: 点击Repository,连接SVN服务器R ...
- java 字符串截取的几种方式
1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = " ...
- 440 K-th Smallest in Lexicographical Order 字典序的第K小数字
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字.注意:1 ≤ k ≤ n ≤ 109.示例 :输入:n: 13 k: 2输出:10解释:字典序的排列是 [1, 10, 11, 1 ...
- commons-lang常用工具类StringEscapeUtils使用--转
https://my.oschina.net/ydsakyclguozi/blog/341496 在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是 ...
- jquery判断checkbox最多选几个
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- [转]Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
前言 结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文.使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极 ...
- IIS7 网站发布
选择“网站” 添加网站