wannafly挑战赛11----白兔的字符串
2018-03-15 21:04
471 查看
题目链接
这道题的本质思想也是暴力
但是是有技巧的暴力
首先用到了hash算法
将母串的所有情况列出来,然后存到数组里面
对于子串,查询是否有该情况,一般用map,但是map太慢,这里用unordered_set
unordered_set用法#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define ull unsigned long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=1e6+7;
const int base=233;
using namespace std;
unordered_set<ull> s;
char s1
,s2
;
ull p
;
int len_a,len_b;
void init()
{
len_a=strlen(s1+1);
ull Hash=0;
p[0]=1;//p数组记录单位
for(int i=1; i<=len_a; i++)
{
Hash=Hash*base+s1[i]-'0';//计算总的哈希值
p[i]=p[i-1]*base;
}
s.insert(Hash);
for(int i=1; i<=len_a; i++)
{
Hash=(Hash-(s1[i]-'0')*p[len_a-1])*base+s1[i]-'0';//将所有情况存储起来
s.insert(Hash);
}
}
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
scanf("%s",s1+1);
init();
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%s",s2+1);
len_b=strlen(s2+1);
ull Hash=0;
ull ans=0;
for(int i=1; i<=len_a; i++)
{
Hash=Hash*base+s2[i]-'0';
}
if(s.count(Hash)) ans++;
for(int i=len_a+1; i<=len_b; i++)
{
Hash=(Hash-(s2[i-len_a]-'0')*p[len_a-1])*base+s2[i]-'0';
if(s.count(Hash)) ans++;
}
printf("%llu\n",ans);
}
return 0;
}
代码转自:http://blog.csdn.net/yyy_3y/article/details/79546003
这道题的本质思想也是暴力
但是是有技巧的暴力
首先用到了hash算法
将母串的所有情况列出来,然后存到数组里面
对于子串,查询是否有该情况,一般用map,但是map太慢,这里用unordered_set
unordered_set用法#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define ull unsigned long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=1e6+7;
const int base=233;
using namespace std;
unordered_set<ull> s;
char s1
,s2
;
ull p
;
int len_a,len_b;
void init()
{
len_a=strlen(s1+1);
ull Hash=0;
p[0]=1;//p数组记录单位
for(int i=1; i<=len_a; i++)
{
Hash=Hash*base+s1[i]-'0';//计算总的哈希值
p[i]=p[i-1]*base;
}
s.insert(Hash);
for(int i=1; i<=len_a; i++)
{
Hash=(Hash-(s1[i]-'0')*p[len_a-1])*base+s1[i]-'0';//将所有情况存储起来
s.insert(Hash);
}
}
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
scanf("%s",s1+1);
init();
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%s",s2+1);
len_b=strlen(s2+1);
ull Hash=0;
ull ans=0;
for(int i=1; i<=len_a; i++)
{
Hash=Hash*base+s2[i]-'0';
}
if(s.count(Hash)) ans++;
for(int i=len_a+1; i<=len_b; i++)
{
Hash=(Hash-(s2[i-len_a]-'0')*p[len_a-1])*base+s2[i]-'0';
if(s.count(Hash)) ans++;
}
printf("%llu\n",ans);
}
return 0;
}
代码转自:http://blog.csdn.net/yyy_3y/article/details/79546003
相关文章推荐
- Wannafly挑战赛11 D-白兔的字符串
- Wannafly挑战赛11 D 白兔的字符串 (字符串hash)
- Wannafly挑战赛11_D_白兔的字符串(字符串hash)
- Wannafly挑战赛11 D 白兔的字符串 [Hash]
- 【Wannafly挑战赛11】 A B【找规律+费马小定理】 D【字符串HASH】
- Wannafly挑战赛11 -A 白兔的分身术
- Wannafly挑战赛11-C:白兔的棋盘(轮廓线DP)
- Wannafly挑战赛11 B 白兔的式子【阶乘逆元 + 预处理 + 板子】
- Wannafly 挑战赛11 B白兔的式子
- Wannafly挑战赛11 白兔的式子 (组合数取模)
- Wannafly挑战赛11 A B D【规律+逆元+字符串hash】
- Wannafly挑战赛11 B、白兔的式子
- Wannafly挑战赛11-白兔的式子(组合数取模)
- Wannafly挑战赛11 A-白兔的分身术
- Wannafly挑战赛11 - 白兔的分身术
- Wannafly挑战赛11 白兔的式子
- Wannafly挑战赛11 B-白兔的式子
- Wannafly交流赛1: D. 白兔的字符串(随机+EXKMP)
- 牛客网Wannafly挑战赛11--白兔的式子
- Wannafly挑战赛11_A_B_D