HDU 5782 Cycle(KMP+哈希)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5782
题意:
给出两个长度相等的字符串,输出两个字符的每个前缀是否循环相同。
思路:
如果连个串循环相同的话,那一定可以找到一个位置,使得第一个串的前缀等于另一个串的后缀。这样的话其实就是扩展kmp的思想,kmp处理,然后用哈希来比较两段字符是否相等。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = + ; const int seed =; int n;
int ans[maxn];
int f[maxn];
ll base[maxn];
ll Hash[][maxn];
char s1[maxn],s2[maxn]; int check(int flag, int l, int r)
{
if(l-==r) return ;
int L=r-l+;
ll tmp1 = Hash[flag][l]-Hash[flag][l+L]*base[L];
ll tmp2 = Hash[!flag][]-Hash[!flag][+L]*base[L];
return tmp1==tmp2;
} void kmp(char* T, char* P, int flag)
{
f[]=; f[]=;
for(int i=;i<n;i++)
{
int j=f[i];
while(j && P[i]!=P[j]) j=f[j];
f[i+]= P[i]==P[j]?j+:;
} int j=;
for(int i=;i<n;i++)
{
while(j && P[j]!=T[i]) j=f[j];
if(P[j]==T[i])
{
j++;
if(!ans[i]) ans[i]=check(flag,j,i);
}
}
} int main()
{
//freopen("in.txt","r",stdin);
base[]=;
for(int i=;i<=maxn;i++) base[i]=base[i-]*seed; while(~scanf("%s%s",s1,s2))
{
memset(ans,,sizeof(ans));
n=strlen(s1);
Hash[][n]=Hash[][n]=;
for(int i=n-;i>=;i--)
{
Hash[][i]=Hash[][i+]*seed+(s1[i]-'a'+);
Hash[][i]=Hash[][i+]*seed+(s2[i]-'a'+);
}
kmp(s1,s2,);
kmp(s2,s1,);
for(int i=;i<n;i++) printf("%d",ans[i]);
puts("");
}
return ;
}
HDU 5782 Cycle(KMP+哈希)的更多相关文章
- HDU 5782 Cycle —— KMP
题目:Cycle 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个字符串,判断两个字符串的每一个前缀是否循环相等(比如abc 和 ca ...
- HDU 5782 Cycle(KMP+Hash)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位 ...
- HDU 5763 Another Meaning (KMP/哈希+DP)
题目大意:给你两个串,一长一短,如果长串中某个子串和短串完全相同,则这个子串可以被替换成"#",求长串所有的表达形式....... 比如"hehehehe"和& ...
- hdu 5782(kmp+hash)
Cycle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 2087 KMP模板题
1.HDU 2087 2.题意:一个主串,一个子串,求子串在主串里出现了几次. 3.总结:看了题解,还是不太懂.. //#include<iostream>#include<cmat ...
- Number Sequence HDU 1711(KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 首次接触KMP,自己都不是特别理解.在网上百度看了好几个帖子之后,对KMP也有了初步的理解. #inclu ...
- [HDU 4821] String (字符串哈希)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题目大意:给你M,L两个字母,问你给定字串里不含M个长度为L的两两相同的子串有多少个? 哈希+枚 ...
- hdu 1686 Oulipo KMP匹配次数统计
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 分析:典型的KMP算法,统计字符串匹配的次数. 用Next数组压缩时间复杂度,要做一些修改. / ...
- HDU 4763 (KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意:给定一串字符,从中找出符合“EAEBE”格式的E的最大字符数.AB可以是任意数量的任意 ...
随机推荐
- maven项目没有src/test/java和src/test/resources目录问题解决
新建maven项目,如下图示: 只有src/main/java和src/main/resources两个目录,而没有src/test/java和src/test/resources,于是第一反应是没有 ...
- Linux服务器配置---安装nfs
安装nfs NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 由于NFS支持的功能很多,不同功能会使用不同程序 ...
- 什么是redis,redis简介
redis是一个key-value存储系统.包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). 高可用分布式集群 一, ...
- eclipse 依赖别的 工程 断点进不去
maven Debug 发现进不了断点. 点击右键-->Properties-->Java Compiler-->Classfile Generation, 勾选上Add line ...
- jenkins2
创建工程 Eclipse创建工程:注意工程的路径,不是/home/svn,这个是svn的根目录. 是工程上传的路径,Apple直接下面有pom文件. 创建工程,创建一个任务就是创建一个工程. 需要注意 ...
- strace跟踪多进程与内核的交互
1.ptrace的说明 ptrace原型: #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t ...
- 怎样从外网访问内网Lighttpd?
本地安装了一个Lighttpd,只能在局域网内访问,怎样从外网也能访问到本地的Lighttpd呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Lighttpd 默认安装的Lighttpd端口是80 ...
- MMU工作原理(转)
源: MMU工作原理
- 启动项详解和更改deepin启动内核的方法
内容来自网上查找和总结以及自己的尝试 boot里面的启动项是根据其它文件生成的,如果改boot里面,会在你更新grub后再次回到原来的状态.(之后 我(有显卡驱动问题的用户)通过在开机时选择系统页面按 ...
- be动词
编辑 讨论 be动词,意思和用法很多,一般的意思是:是,此种用法,有多种变化形式,is,am,are,was,were,being,been,to be.另外,be动词还有成为的意思.根据句子中不同的 ...