阿轩在纸上写了两个字符串,分别记为A和B。

利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。

不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:

在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。

例如:A=aabcde,B=ab,则A有aabcde、abcde、bcde、cde、de、e这6个后缀子串,它们与B=ab的匹配长度分别是1、2、0、0、0、0。

因此A有4个位置与B的匹配长度恰好为0,有1个位置的匹配长度恰好为1,有1个位置的匹配长度恰好为2。

输入格式

第一行输入三个整数N,M,Q,分别表示A串长度、B串长度、问题个数。

第二行输入字符串A,第三行输入字符串B。

接下来Q行每行输入1个整数x,表示一个问题。

输出格式

输出共Q行,依次表示每个问题的答案。

数据范围

1≤N,M,Q,x≤2000001≤N,M,Q,x≤200000

输入样例:

6 2 5
aabcde
ab
0
1
2
3
4

输出样例:

4
1
1
0
0 题意:要你求原来的字符串的所有起点位置去匹配第二个字符串能匹配多少个字符,然后我们再输入x,看正好匹配长度为x的起点位置有多少个
思路:这个我们看能匹配多少个字符,这里其实匹配也就相当于相等,判断字符串相等自然用哈希,让我们我们又不知道他匹配的长度是多少,我们就需要枚举,既然可以枚举我们就可以优化成二分
求出两个字符串的哈希,然后预处理每个位置,二分长度用map存下来即可
#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll n,m,q;
char s1[maxn],s2[maxn];
ull dp1[maxn],dp2[maxn],f[maxn];
map<ll,ll> mp;
void hash_code(){
f[]=;
for(int i=;i<=n;i++){
dp1[i]=dp1[i-]*+s1[i]-'a'+;
f[i]=f[i-]*;
}
for(int i=;i<=m;i++){
dp2[i]=dp2[i-]*+s2[i]-'a'+;
}
}
int check(ll dex,ll len){
if(dp1[dex+len-]-dp1[dex-]*f[len]==dp2[len]){
return ;
}
return ;
}
int main(){
cin>>n>>m>>q;
cin>>s1+>>s2+;
hash_code();
for(ll i=;i<=n;i++){
ll l=,r=m+,mn=;
while(l<r){
ll mid=(l+r)/;
if(check(i,mid)){
mn=mid;
l=mid+;
}
else{
r=mid;
}
}
mp[mn]++;
// cout<<mn<<"\n";
}
int x;
for(int i=;i<q;i++){
cin>>x;
cout<<mp[x]<<"\n";
}
} /*
6 2 5
aabcde
ab
0
1
2
3
4
5
*/
 

AcWing 160. 匹配统计 (哈希+二分) 打卡的更多相关文章

  1. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  2. 【BZOJ3507】通配符匹配(哈希,动态规划)

    [BZOJ3507]通配符匹配(哈希,动态规划) 题面 BZOJ 题解 对于匹配唯一存在影响的只有通配符,而\(?\)的影响也并不大,所以唯一需要仔细考虑的是\(*\). 考虑一个\(dp\),设\( ...

  3. CH1809匹配统计【KMP】

    1809 匹配统计 0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B” ...

  4. BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)

    先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串. 然后二分子串(答案)的长度,每次把长度为$md ...

  5. LOJ.6066.[2017山东一轮集训Day3]第二题(树哈希 二分)

    LOJ 被一件不愉快的小事浪费了一个小时= =. 表示自己(OI方面的)智商没救了=-= 比较显然 二分+树哈希.考虑对树的括号序列进行哈希. 那么每个点的\(k\)子树的括号序列,就是一段区间去掉距 ...

  6. USACO 5.1 Musical Themes(哈希+二分)

    Musical ThemesBrian Dean A musical melody is represented as a sequence of N (1 <= N <= 5000) n ...

  7. [BZOJ]4650 优秀的拆分(Noi2016)(哈希+二分)

    传送门   题解 听说大佬们这题都是用SA秒掉的 然而SA的时间复杂度的确很优秀,缺点就是看不太懂…… 然后发现一位大佬用哈希华丽的过了此题,而且讲的特别清楚->这里 我们只要考虑以每一个点结尾 ...

  8. HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. URAL - 1486 Equal Squares 二维哈希+二分

    During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...

随机推荐

  1. c#处理3种json数据的方式

    原文出处:http://www.jb51.net/article/48027.htm 一.C#处理简单json数据 json数据: {"result":"0", ...

  2. JS基础入门篇(二十四)—DOM(上)

    1.常用的节点类型,nodeType,attributes,childNodes. 1.元素节点 - 1 2.属性节点 - 2 3.文本节点 - 3 4.注释节点 - 8 5.文档节点 - 9 查看节 ...

  3. nodejs操作消息队列RabbitMQ

    一. 什么是消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已.其主要用途:不同进程Process/ ...

  4. 团队冲刺DAY4

    DES算法 算法概要 在DES.java当中创立两个方法分别用作加密和解密 通过 `public static byte[] encrypt(byte[] data, String sKey) 创建方 ...

  5. python 国内镜像加速

    原因 经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具但是由于国外官方默认pip访问速度慢,经常被墙,导致无法安装,所以我们最好是将自己使用的pip源更换一下,这样就能解决 ...

  6. hbase shell插入根据条件查询数据

    hbase shell插入根据条件查询数据 创建并插入数据: hbase(main):179:0> create 'scores','grade','course' hbase(main):18 ...

  7. css代码思考:display和float

    关于display <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. Celery 'Getting Started' not able to retrieve results; always pending

    参考 根据Celery的官方文档,当使用windows 10 64-bit, Python 2.7,Erlang 64-bit binary, RabbitMQ server and celery r ...

  9. javaScript 通过location对象获取项目的url

    项目中有些要通过jQuery 动态加载,其中需要一些路径,使用相对路径会出现错误,报 $("#t1").html("设置或返回从井号 (#) 开始的 URL(锚)---& ...

  10. windows 安装虚拟环境

    步骤一:安装virtualenv 在windows cmd终端下使用输入:pip install virtualenv 步骤二:新建虚拟环境 在cmd终端输入virtualenv testvir(环境 ...