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+哈希)的更多相关文章

  1. HDU 5782 Cycle —— KMP

    题目:Cycle 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个字符串,判断两个字符串的每一个前缀是否循环相等(比如abc 和 ca ...

  2. HDU 5782 Cycle(KMP+Hash)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位 ...

  3. HDU 5763 Another Meaning (KMP/哈希+DP)

    题目大意:给你两个串,一长一短,如果长串中某个子串和短串完全相同,则这个子串可以被替换成"#",求长串所有的表达形式....... 比如"hehehehe"和& ...

  4. hdu 5782(kmp+hash)

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  5. HDU 2087  KMP模板题

    1.HDU 2087 2.题意:一个主串,一个子串,求子串在主串里出现了几次. 3.总结:看了题解,还是不太懂.. //#include<iostream>#include<cmat ...

  6. Number Sequence HDU 1711(KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 首次接触KMP,自己都不是特别理解.在网上百度看了好几个帖子之后,对KMP也有了初步的理解. #inclu ...

  7. [HDU 4821] String (字符串哈希)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题目大意:给你M,L两个字母,问你给定字串里不含M个长度为L的两两相同的子串有多少个? 哈希+枚 ...

  8. hdu 1686 Oulipo KMP匹配次数统计

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 分析:典型的KMP算法,统计字符串匹配的次数. 用Next数组压缩时间复杂度,要做一些修改. / ...

  9. HDU 4763 (KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意:给定一串字符,从中找出符合“EAEBE”格式的E的最大字符数.AB可以是任意数量的任意 ...

随机推荐

  1. ETL面试题集锦

    1. What is a logical data mapping and what does it mean to the ETL team? 什么是逻辑数据映射?它对ETL项目组的作用是什么? 答 ...

  2. Hue中hive(hive cli)查询结果中显示列名,不带表名

    hive cli中显示列名 进入hive cli后 set hive.cli.print.header=true; 之后出现列名,但是带了表名前缀,由于网上没找到资料,于是到官网肉眼扫描所有参数,总算 ...

  3. C# 自定义承载控件

    例如ToolStripTextBox类,里面的封装就是一个TextBox控件..NET的类库提供了ToolStripComBox和ToolStripProgressBar两个类.这些类都是从ToolS ...

  4. python 关键字yield解析

    python 关键字yield解析 yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator.y ...

  5. Python+OpenCV图像处理(三)—— Numpy数组操作图片

    一.改变图片每个像素点每个通道的灰度值 (一) 代码如下: #遍历访问图片每个像素点,并修改相应的RGB import cv2 as cv def access_pixels(image): prin ...

  6. jquery 页面分页的实现

      <!DOCTYPE html> <html> <head> <title>分页</title> <link rel="s ...

  7. getElementsByClassName方法的封装

    Element.prototype.getElementsByClassName = function(searchClass,node,tag){ if(document.getElementsBy ...

  8. Python进阶【第一篇】:Python简介

    Python简介 1.Python的由来 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 2.C 和 Python.Ja ...

  9. GC Root 对象有哪些

    (1)虚拟机(JVM)栈中引用对象 (2)方法区中的类静态属性引用对象   (3)方法区中常量引用的对象(final 的常量值) (4)本地方法栈JNI的引用对象

  10. django中的模型详解-1

    在说明django模型之前,首先来说明一下django的生命周期,也就是一个请求到达django是如何处理的.[暂时不包含中间件] 浏览器的请求---->到达django中的urls中找到对应的 ...