[POJ 2774] Long Long Message (字符串哈希+二分)
来源:互联网 发布:郑州富士康网络招聘 编辑:程序博客网 时间:2024/06/16 04:17
链接
POJ 2774
题意
给出两个字符串,寻找其最长公共子串。
注意字符串的长度较大,100000。
思路
字符串哈希典型问题,寻找N个字符串的最长公共子串。对于N个长度不超过L的字符串,哈希可以在O(N*L*log(L))内解决此问题。本题N为2。
做法是对长度进行二分,对每个长度len,可以在线性时间内求出字符串s1中所有长度为len的哈希值,把这些哈希值存在哈希表中。同样对s2求出其长度为len的哈希值,对每个哈希值查找哈希表,如果哈希表中已存在该哈希值,则表示s1中含有相同子串。
感觉本题存储哈希值的方式很优雅(从别人的代码中学来的),建议大家学习一下。
代码
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cstdlib>using namespace std;typedef unsigned long long ulint;//ulint seed = 100000007uLL;ulint seed = 31uLL;#define maxn 299999char s1[maxn], s2[maxn];int len1, len2;int bg[maxn], nx[maxn];ulint H[maxn], xp[maxn];bool check(int len){ //printf("check len = %d\n", len); memset(bg, 0, sizeof(bg)); ulint t = 1, ah = 0, bh = 0; int e = 0; for(int i = 0; i < len; i++) { t *= seed; ah = ah * seed + s1[i]; bh = bh * seed + s2[i]; } H[++e] = ah; nx[e] = bg[ah % maxn]; bg[ah % maxn] = e; for(int i = len; i < len1; i++) { ah = ah * seed - s1[i-len] * t + s1[i]; H[++e] = ah; nx[e] = bg[ah % maxn]; bg[ah % maxn] = e; } for(int pos = bg[bh % maxn]; pos; pos = nx[pos]) { if(H[pos] == bh) return true; } for(int i = len; i < len2; i++) { bh = bh * seed - s2[i-len] * t + s2[i]; for(int pos = bg[bh % maxn]; pos; pos = nx[pos]) { if(H[pos] == bh) return true; } } return false;}int main(){ //freopen("2774.txt", "r", stdin); scanf("%s%s", &s1, &s2); len1 = strlen(s1); len2 = strlen(s2); for(int i = 0; i < max(len1, len2); i++) { if(i < len1) s1[i] = s1[i] - 'a' + 1; if(i < len2) s2[i] = s2[i] - 'a' + 1; } int l = 1, r = min(len1, len2), m, res = 0; while(l <= r) { m = (l + r) >> 1; if(check(m)) { //printf("ok\n"); l = m + 1; res = max(res, m); } else r = m - 1; } cout << res << endl; return 0;}
0 0
- [POJ 2774] Long Long Message (字符串哈希+二分)
- 2774 -- Long Long Message(字符串hash)
- poj 2774 Long Long Message
- POJ 2774 Long Long Message
- poj 2774 Long Long Message
- poj 2774 Long Long Message
- POJ 2774 Long Long Message
- POJ-2774-Long Long Message
- POJ 2774 Long Long Message
- POJ 2774 Long Long Message
- poj 2774 Long Long Message
- poj 2774 Long Long Message
- poj 2774 Long Long Message
- POJ 2774 Long Long Message
- POJ 2774 Long Long Message
- POJ 2774 Long Long Message
- POJ 2774 Long Long Message
- POJ - 2774 Long Long Message
- 为什么你有10年经验,但成不了专家?
- 把数值转换成中文数字(练习)
- annimate
- Java基础-IO学习之字符流
- NetBeans快捷键
- [POJ 2774] Long Long Message (字符串哈希+二分)
- 静态成员函数,静态成员数据,常成员
- 压测xx业务数据库资源大量等待,存在表锁问题,导致数据库无法正常执行解决办法
- 关于使用J-flash将程序下载到stm32f407ig中遇到的问题
- Poedu_计算机基础_复习_20160828
- 【noip】Mayan游戏 搜索
- Jmeter使用奇葩问题集锦
- LINUX IO 程序编程
- idea设置注释作者信息