Hdu 5782 Cycle(拓展KMP+Hash)
来源:互联网 发布:小米电视怎么样 知乎 编辑:程序博客网 时间:2024/06/05 11:36
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5782
思路:
1.若两串st1、st2循环同构(即两串首位相接旋转后相等),则必存在st1=str1+str2,st2=str2+str1(即串1的后缀等于串2的前缀,串1的前缀等于串2的后缀)。
2.枚举长度len,对于前缀s1、s2,使用扩展KMP求出串s1的后缀[i....len]与串s2的最大前缀长度l,若l+i>=len,则比较剩余部分是否相等(即s1的前缀是否等于s2的后缀,若相等,即为循环同构),比较是否相等可通过Hash实现。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define debugusing namespace std;typedef long long LL;typedef unsigned long long ULL;const int base=233;const int maxn=1e4+10;int len;int nt[maxn],ext[maxn];char st1[maxn],st2[maxn];ULL x[maxn],Hash[2][maxn];void getnext(char *T){ int i,length=strlen(T); nt[0]=length; for(i=0; i<length-1&&T[i]==T[i+1]; i++); nt[1]=i; int a=1; for(int k=2; k<length; k++) { int p=a+nt[a]-1,l=nt[k-a]; if((k-1)+l>=p) { int j=(p-k+1)>0?(p-k+1):0; while(k+j<length&&T[k+j]==T[j]) j++; nt[k]=j,a=k; } else nt[k]=l; }}void getext(char *S,char *T){ memset(nt,0,sizeof(nt)); getnext(T); int Slen = strlen(S), Tlen = strlen(T), a = 0; int MinLen = Slen>Tlen?Tlen:Slen; while(a<MinLen && S[a]==T[a]) a++; ext[0] = a, a = 0; for(int k = 1; k < Slen; k++) { int p = a+ext[a]-1, L = nt[k-a]; if( (k-1)+L >= p ) { int j = (p-k+1)>0? (p-k+1) : 0; while(k+j<Slen && j<Tlen && S[k+j]==T[j] ) j++; ext[k] = j; a = k; } else ext[k] = L; }}void init(){ x[0]=1; for(int i=1; i<maxn; i++) x[i]=x[i-1]*base;}void preHash(int id,string s){ Hash[id][0]=0; for(int i=0; i<len; i++) Hash[id][i]=Hash[id][i-1]*base+(s[i]-'a');}ULL getHash(int l,int r,int id){ return Hash[id][r]-Hash[id][l-1]*x[r-l+1];}int main(){#ifdef debu freopen("in.txt","r",stdin);#endif // debug init(); while(scanf("%s%s",st1,st2)!=EOF) { len=strlen(st1); getext(st1,st2); preHash(0,st1); preHash(1,st2); for(int i=1; i<=len; i++) { int flag=0; for(int j=0; j<i; j++) { if(ext[j]+j>=i) { if(getHash(0,j-1,0)==getHash(min(i-j,ext[j]),i-1,1)) { flag=1; break; } } } if(flag) printf("1"); else printf("0"); } printf("\n"); } return 0;}
阅读全文
0 0
- Hdu 5782 Cycle(拓展KMP+Hash)
- HDU 6153 (kmp拓展)
- HDU 4763 拓展KMP
- hdu 6153 拓展kmp
- HDU 6153 拓展kmp
- hdu 1043(搜索 + 康拓展开hash)
- HDU 6153 A Secret(后缀转前缀+拓展KMP)
- HDU 4749 KMP + BIT HASH
- HDU 4300 Clairewd’s message(拓展KMP)
- HDU 4333 Revolving Digits(拓展KMP)
- HDU 4333 Revolving Digits-----拓展KMP
- HDU 3613 Best Reward ---- 拓展KMP
- hdu 4333 Revolving Digits(拓展KMP)
- HDU 2087 / POJ 3461 KMP拓展
- HDU - 4763 Theme Section(拓展kmp)
- hdu 4333 Revolving Digits 拓展kmp算法
- Best Reward (hdu 3613 拓展KMP)
- HDU 6153 A Secret(拓展KMP)
- JavaScript中append()和innerHTML的一点自己见解
- Struts 2 远程代码执行漏洞加固方法
- ant+jmeter接口测试
- cobol连接数据库
- camera2 opengl实现滤镜效果录制视频 四 录像
- Hdu 5782 Cycle(拓展KMP+Hash)
- 关于虚拟机与宿主机之间的网络连接问题
- tomcat的server.xml配置文件中三个端口的作用
- Excel导入异常:Cannot get a text value from a numeric cell
- 如何设置winscp显示隐藏文件
- C#中委托、事件和回调函数区别与联系
- (Dynamic HTML)--3.使用checkBox模仿购买商品(以及对商品的增删改)
- 专访iDST华先胜:城市大脑,对城市的全量、实时认知和搜索
- Java 常见异常