题目大意:

给出两个串(长度<=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寻找主人的更多相关文章

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

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

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

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

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

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

  4. vijos-1382 寻找主人

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

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

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

  6. 【bzoj1398】Vijos1382寻找主人 Necklace

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

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

    传送门 解题思路 最小表示法.首先对于判断是不是循环同构的串,直接扫一遍用哈希判即可.然后要输出字典序最小的就要用到最小表示法,首先可以把串复制一遍,这样的话就可以把串变成静态操作.如果对于两个位置\ ...

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

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

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

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

随机推荐

  1. 【194】Windows 上使用 wget

    本文包括两部分,首先就是在 Windows 使用 wget 来下载文件,这样固然很好,然而问题并非这么简单,在 PowerShell 4.0 版本中增加了 Invoke-WebRequest 的别名 ...

  2. Bootstrap指定表格字段宽度

    默认情况下,表格会占据屏幕所有宽度,可以使用bootstrap的布局功能.但表格标题字段的宽度必须与相应字段内容的宽度一致. <div class="container"&g ...

  3. Ruby Time类和Date类

    Time类 更新: 2017/06/23 更新了Data/Time在model模式下的便利方法 更新: 2018/10/12 修改了%Y相关描述防止误解  年月日时分秒,时区    生成  获取当前时 ...

  4. 洛谷 P4012 深海机器人问题 【最大费用最大流】

    和火星那个有点像,但是这个价值直接在路径上,不用拆点,对于每条价值为w的边(i,j),连接(i,j,1,w)(i,j,inf,0),表示价值只能取一次,然后连接源点和所有出发点(s,i,k,0),所有 ...

  5. [POJ2750]Potted Flower

    Description The little cat takes over the management of a new park. There is a large circular statue ...

  6. _bzoj1003 [ZJOI2006]物流运输【预处理】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 预处理出第i天到第j天走一条航线时的最短路. #include <cstdio& ...

  7. B - Archer

    Problem description SmallR is an archer. SmallR is taking a match of archer with Zanoes. They try to ...

  8. C++中的数学函数汇总

    math.h 数学函数库,一些数学计算的公式的具体实现是放在math.h里,具体有: 1 三角函数 double sin (double); double cos (double); double t ...

  9. android开发学习——android studio 引入第三方库的总结

    http://www.jianshu.com/p/0c592fff5d89 总结的很溜

  10. 把Scheme翻译成Java和C++的工具

    一.为什么要写这个工具? 公司内容有多个项目需要同一个功能,而这些项目中,有的是用Java的,有的是用C++的,同时由于某些现实条件限制,无法所有项目都调用统一的服务接口(如:可能运行在无网络的情况下 ...