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 判 ...
随机推荐
- INT_PTR数据类型
A signed integer type for pointer precision. Use when casting a pointer to an integer to perform poi ...
- 关于CentOS 7安装solr+tomcat
1.Solr7.1.0 安装部署(centos7) Solr7.1.0为目前的最新版,安装环境需要jdk1.8 或者更高,容器我用的tomcat,也建议tomcat8.0或者更高 1.1.下载solr ...
- (转)C#中数组、ArrayList和List三者的区别
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...
- JNI编程(一) —— 编写一个最简单的JNI程序(转载)
转自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...
- 【性能测试】服务器资源监测工具sar安装
[root@yyy ~]# sar Cannot open /var/log/sa/sa19: No such file or directory 在Linux系统中,运行sar命令,发现无法执行: ...
- bzoj 3751: [NOIP2014]解方程【数学】
--我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了-- 就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0 #include&l ...
- P4323 [JSOI2016]独特的树叶(树哈希)
传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...
- 执行linux脚本出现问题
1. 权限不够: 使用 chmod +x XXX.sh 提升权限 2. 出现:/bin/bash^M: bad interpreter: No such file or directory 原因:文件 ...
- 机器学习基础算法__python实现(基于numpy等基础库)
# 博客转自https://blog.csdn.net/weixin_39561100/article/details/80879211 主要是将<机器学习实战>中的算法实现一遍,后续会慢 ...
- Selenium2工作原理
Selenium 经历了两个版本,Selenium 1.0 和 Selenium 2.0,本文仅介绍Selenium2的原理,在Selenium 2.0 主推的是WebDriver,Selenium2 ...