4084: [Sdoi2015]bigyration hash+map
2016-02-28 15:24
274 查看
60分暴力。。BZOJ卡过去了。
我们先确定一个长串,那么总串的一半就确定了,然后把短串hash后放入map,枚举长串的断点放进去匹配,如果匹配成功就统计答案。
我们先确定一个长串,那么总串的一半就确定了,然后把短串hash后放入map,枚举长串的断点放进去匹配,如果匹配成功就统计答案。
#include<iostream> #include<cstdio> #include<cstring> #include<map> #define base 233 #define U unsigned int #define N 4000005 using namespace std; int total_s,total_t,len_s,len_t; int ans,len; U T ,h ; map<U,int> mp1,mp2; string str_s ,str_t ; char s ; inline U get_hash(int l,int r) { return h[r]-h[l-1]*T[r-l+1]; } int main() { scanf("%d%d%d%d",&total_s,&total_t,&len_s,&len_t); len=len_s+len_t>>1; if (len_s<len_t) swap(total_s,total_t),swap(len_s,len_t); for (int i=1;i<=total_s;i++) {scanf("%s",s); str_s[i]=string(s);} for (int i=1;i<=total_t;i++) {scanf("%s",s); str_t[i]=string(s);} for (int i=1;i<=total_t;i++) { U hash=0; for (int j=1;j<=len_t;j++) hash=hash*base+str_t[i][j-1]-'a'; mp1[hash]++; } T[0]=1; for (int i=1;i<=len_s;i++) T[i]=T[i-1]*base; for (int i=1;i<=total_s;i++) { mp2.clear(); for (int j=1;j<=len_s;j++) h[j]=h[j-1]*base+str_s[i][j-1]-'a'; for (int j=1;j<=len;j++) { U hash=get_hash(1,j-1)+get_hash(j,len)*T[j-1]; if (mp2[hash]) continue; mp2[hash]=1; ans+=mp1[hash-get_hash(len+1,len_s)*T[len_t]]; } } cout << ans << endl; return 0; }
相关文章推荐
- Activiti Model Editor
- ExtJS+ASP.NET自己定义曲线
- android 管理wifi
- gcd
- HTTP服务七层架构技术探讨
- 数据结构习题答案--线性表
- 在CentOS 上卸载vsftpd FTP服务器
- 【BZOJ3622】已经没有什么好害怕的了
- 4.0 第十一章 Linq
- 关于String类中重写的equals方法
- [accept 4 ] what the difference between accept4 and accept
- 数据结构习题--线性表
- 扩展activiti使用自己的用户表和群组表
- NS2常用命令总结
- 最详细的Log4j使用教程
- getRequestDispatcher()与sendRedirect()的区别
- 实现计时器 的简单demo
- POJ3345 Bribing FIPA(树形DP)
- ajax下载文件
- SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 3)