【题目链接】 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)的更多相关文章

  1. HDU 5782 Cycle(KMP+哈希)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个长度相等的字符串,输出两个字符的每个前缀是否循环相同. 思路: 如果连个串循环相 ...

  2. HDU 4749-Parade Show(KMP变形)

    题意: 给出一个母串和一个模式串求母串中最多能分成最大的子串数(每个字串中的各个数字的大小关系和模式串相同) 分析: KMP变形匹配规则变一下即可,用当前数字和下个数字的差表示,大小关系方便匹配 #i ...

  3. 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 ...

  4. hdu 1696 Oulipo(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题意 查询字符串 $p$ 在字符串 $s$ 中出现了多少次,可重叠. 题解 KMP模板题. Ti ...

  5. hdu 6068--Classic Quotation(kmp+DP)

    题目链接 Problem Description When online chatting, we can save what somebody said to form his ''Classic ...

  6. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  7. 【BZOJ3670】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  8. HDU 3533 Escape(大逃亡)

    HDU 3533 Escape(大逃亡) /K (Java/Others)   Problem Description - 题目描述 The students of the HEU are maneu ...

  9. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

随机推荐

  1. GitHub 菜鸟使用

    之前有用过一次,但是一直弄不明白怎么用,今天我又试了一下,成功了,现在我就记录下来,为了以后的使用以及帮助那些跟我原先一样不会用的同学 进入正题: Step 1: 注册GitHub账号 https:/ ...

  2. Microsoft Azure 大计算 – 宣布收购 GreenButton

     数据以及令人不可思议的计算能力,正在改变我们日常业务的经营方式,从科学和工程到媒体和金融,各行各业的客户正逐渐意识到什么是可能的.我们对整个基因组进行分析,以研制新药物.我们构建金融和保险模型, ...

  3. CF 293 E Close Vertices (树的分治+树状数组)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一棵树,问有多少条路径权值和不大于w,长 ...

  4. sass的cd进入目录

    今天在弄sass安装进入项目文件命令 直接f:

  5. android UI进阶之style和theme的使用

    今天来和大家分享一下android中UI设计里面常会用到的style和theme. 首先,style和theme都是资源,android提供了很多这样的默认资源.你可以来使用它们.同时你也可以自己定义 ...

  6. Phalcon 调试应用程序

    调试应用程序(Debugging Applications)¶ Phalcon中提供了提供了几种调试级别即通知,错误和异常. 异常类 Exception class 提供了发生错误时的一些经常使用的调 ...

  7. android部分控件应用解析

    java中的接口回调机制图解 1. Adapter 接口概述   Adapter是一个顶层列表视图和底层数据的桥梁,通过adapter可以获取列表视图中所体现的数据条目,并且通过adapter可以为数 ...

  8. nodejs在服务器上运行

     nodejs运行之后,关掉链接,网站运行就会断开,需要安装forever,后台执行. 安装方法如下(在windows和Linux下都能运行)://forever的安装: npm install fo ...

  9. mywebsite1

    http://www.wuweierwei.com/ 个人网站 http://www.yyyweb.com/demo/icons-filling/index.html CSS3图标填充效果 http: ...

  10. 关于bootstrap弹出二级对话框的使用

    弹出二级对话框,即在对话框的基础上再弹出一个对话框.这对于CRM管理类系统来说应用场景很常见.看到网上有关于实现二级弹出框的方法,需要在一级对话框页面上添加不少css样式.其实,完全可以不用这么麻烦. ...