hdu6138 hash+二分
来源:互联网 发布:sql row_number() over 编辑:程序博客网 时间:2024/06/05 10:55
题意: n个串,每次查询两个,问最长的公共自串并且这个子串要是n个串其中一个的前缀。
思路:正解是AC自动机。。。这里瞎搞了一下居然过了,直接二分答案,然后判断(类似hash求公共子串一样),就再加一个是不是前缀的判断就好。。
时间复杂度理论上最差n*m*logn。。。但是神奇的只跑了150ms。。。
代码:
#include<bits/stdc++.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof(a))#define bug puts("bug");#define PB push_back#define MP make_pair#define X first#define Y secondtypedef unsigned long long ll;typedef pair<int,int> pii;const int maxn=1e5+10;const int mod=1e9+7;using namespace std;int t,m,n,k;string s[maxn];const unsigned long long SEED = 13331;unsigned long long P[maxn],S[maxn];unsigned long long HS(int l,int r,int x){ if(l==r) return s[x][l-1]; return S[r] - S[l-1]*P[r-l+1];}unordered_set<unsigned long long> st,tmp;bool ok(int len,int x,int y){ tmp.clear(); for(int i=1;i<=s[x].size();i++) S[i] = S[i-1]*SEED + s[x][i-1]; for(int i=1;i+len-1<=s[x].size();i++) tmp.insert(HS(i,i+len-1,x)); for(int i=1;i<=s[y].size();i++) S[i] = S[i-1]*SEED + s[y][i-1]; for(int i=1;i+len-1<=s[y].size();i++) if(tmp.count(HS(i,i+len-1,y))&&st.count(HS(i,i+len-1,y))) return true; return false;}int main(){ P[0] = 1;S[0]=0; for(int i = 1; i < maxn; i++)P[i] = P[i-1] * SEED; ios::sync_with_stdio(false); cin>>t; while(t--){ st.clear(); cin>>n; for(int i=0;i<n;i++) cin>>s[i]; for(int i=0;i<n;i++) for(int j=1;j<=s[i].size();j++) S[j] = S[j-1]*SEED + s[i][j-1],st.insert(S[j]); cin>>m; int x,y; for(int i=0;i<m;i++){ cin>>x>>y; --x;--y; int l=0,r=min(s[x].size(),s[y].size()); while(l<=r){ int mid=(l+r)/2; if(ok(mid,x,y)) l=mid+1; else r=mid-1; } cout<<r<<endl; } } return 0;}
阅读全文
2 0
- hdu6138 hash+二分
- HDU6138(96/600)二分+贪心+hash
- HDU6138
- HDU6138 F Fleet of the Eternal Throne(字典树+后缀数组+二分)
- ural 1613【hash+二分】
- hdu_1496_equations( 二分 or hash )
- BZOJ2258【hash】【二分】
- bzoj 1692 二分+hash
- 字符串hash + 二分答案
- hash(二分+hash)使用map会tle
- hdu 5199 (二分||Hash||map)
- 2084: [Poi2010]Antisymmetry hash+二分
- poj 2785 二分或者hash
- POJ2002&&POJ3432 Squares(二分||hash)
- Poj 2774 二分+字符串hash
- [BZOJ2084]Antisymmetry(二分+hash)
- 检索----二分,二叉查找,hash查找
- HDU 1496 Equations(hash or 二分)
- 计算机网络面试小结
- POJ 1915 Knight Moves bfs || 双向bfs
- ubuntu14.04搜狗输入法中文无法切换英文
- Android编程权威指南(第2版)—第6章挑战练习
- zookeeper 集群搭建,及zoo.cfg配置详解
- hdu6138 hash+二分
- LoadRunner12_脚本中运行JavaScrip
- 误差函数erf
- Redis分布式锁
- HDU 1233 还是畅通工程
- uva 10603 Fill
- 读取数据库数据——分页展示
- 开张
- oracle-视图(view)理解