HDU 5782 Cycle(KMP+Hash)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5782
【题目大意】
给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位相接拼成一个环,两个环通过旋转可以相等。
【题解】
这道题用到了一个神奇的结论,如果S字符串和T字符串循环同构,那么必有S=u+v,T=v+u,而且u和v必有一个是最长匹配。
那么根据这个结论,我们可以用KMP算法在T中找S的最长前缀,也就是每次匹配到i时候的j。那么对于T的前缀和S的后缀,我们直接用哈希来判断是否相等,这样子就可以计算出两个串的前缀是否循环同构了。
【代码】
#include <cstdio>
#include <cstring>
using namespace std;
const int N=10005,base=233;
typedef long long ll;
int T,nxt[N],ans[N];
char a[N],b[N];
ll hash[2][N],p[N];
ll get_hash(int t,int L,int R){
return hash[t][R]-hash[t][L-1]*p[R-L+1];
}
int check(int t,int m,int n){
if(m==n)return 1;
return get_hash(t,m+1,n)==get_hash(t^1,1,n-m);
}
void kmp(int n,char*a,int m,char*b,int t){
int i,j;
for(nxt[1]=j=0,i=2;i<=n;nxt[i++]=j){
while(j&&a[j+1]!=a[i])j=nxt[j];
if(a[j+1]==a[i])j++;
}
for(j=0,i=1;i<=m;i++){
while(j&&a[j+1]!=b[i])j=nxt[j];
if(a[j+1]==b[i]){
j++;
if(!ans[i])ans[i]=check(t,j,i);
}if(j==n)j=nxt[j];
}
}
int main(){
for(int i=p[0]=1;i<N;i++)p[i]=p[i-1]*base;
while(~scanf(" %s %s",a+1,b+1)){
int n=strlen(a+1);
for(int i=1;i<=n;i++){
ans[i]=0;
hash[0][i]=hash[0][i-1]*base+a[i];
hash[1][i]=hash[1][i-1]*base+b[i];
}kmp(n,a,n,b,0);
kmp(n,b,n,a,1);
for(int i=1;i<=n;i++)printf("%d",ans[i]);
puts("");
}return 0;
}
HDU 5782 Cycle(KMP+Hash)的更多相关文章
- HDU 5782 Cycle(KMP+哈希)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个长度相等的字符串,输出两个字符的每个前缀是否循环相同. 思路: 如果连个串循环相 ...
- HDU 4749-Parade Show(KMP变形)
题意: 给出一个母串和一个模式串求母串中最多能分成最大的子串数(每个字串中的各个数字的大小关系和模式串相同) 分析: KMP变形匹配规则变一下即可,用当前数字和下个数字的差表示,大小关系方便匹配 #i ...
- HDU 4468 Spy(KMP+贪心)(2012 Asia Chengdu Regional Contest)
Description “Be subtle! Be subtle! And use your spies for every kind of business. ”― Sun Tzu“A spy w ...
- hdu 1696 Oulipo(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题意 查询字符串 $p$ 在字符串 $s$ 中出现了多少次,可重叠. 题解 KMP模板题. Ti ...
- hdu 6068--Classic Quotation(kmp+DP)
题目链接 Problem Description When online chatting, we can save what somebody said to form his ''Classic ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 【BZOJ3670】动物园(KMP算法)
[BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...
- HDU 3533 Escape(大逃亡)
HDU 3533 Escape(大逃亡) /K (Java/Others) Problem Description - 题目描述 The students of the HEU are maneu ...
- HDU 1043 Eight(八数码)
HDU 1043 Eight(八数码) 00 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descr ...
随机推荐
- js 全局变量
使用cookies可以设置全局变量 ,由于每次刷新变量都会为初始值,cookies可以作为全局变量的容器
- jquery 学习笔记二 隐藏与显示
css找到元素后是添加样式,而jquery找到元素后是添加形为. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...
- nginx 目录密码保护的设置方法
在 nginx.conf 文件中对应的 server 段中 添加 location ^~ /test/ { auth_basic TEST-Login; auth_basic_user_file /r ...
- poj 2274 The Race 最小堆
题目链接 题目大意: 给n个小车, 每个小车有一个初始位置x和初始速度v, 保证x1 < x2..... <xn. 0<v<100. 然后问你一共会发生多少次超车, 以及前10 ...
- windows如何安装和配置mongodb
https://docs.mongodb.com/v3.0/tutorial/install-mongodb-on-windows/
- Myeclipse普通工程转为Maven工程
在SVN导出的Maven项目,或以前不是用Maven管理的项目想要转换成Maven项目,但Myeclipse中右键Configure 找不到(eclipse可行)Convert to maven pr ...
- JS---DOM概述
DOM DOM:文档对象模型document object model DOM三层模型: DOM1:将HTML文档封装成对象 DOM2:将XML文档封装成对象 DOM3:将XML文档封装成对象 DOM ...
- Oracle EBS-SQL (SYS-5):sys_配置文件查询.sql
select distinct l.profile_option_name, v.profile_option_value, fu.user_na ...
- Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)
Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...
- JavaEE Tutorials (19) - Web应用安全入门
19.1Web应用安全概述29519.2保护Web应用安全296 19.2.1指定安全约束297 19.2.2指定认证机制300 19.2.3在部署描述文件中指定认证机制302 19.2.4声明安全角 ...