您的位置:首页 > 其它

4084: [Sdoi2015]bigyration hash+map

2016-02-28 15:24 274 查看
60分暴力。。BZOJ卡过去了。

我们先确定一个长串,那么总串的一半就确定了,然后把短串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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: