阿轩在纸上写了两个字符串,分别记为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. 浅谈scrapy框架安装使用

    Scrapy笔记: 一 安装: pip3 install wheel pip3 install lxml pip3 install pyopenssl pip3 install -i https:// ...

  2. 【Flutter学习】页面跳转之SliverAppBar,CustomScrollView,NestedScrollView的使用

    一,flutter SliverAppbar 控件介绍 SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar ...

  3. imp需要

    导入全部: imp user/password@10.10.10.10:1521/orcl file = C:\Users\Administrator\Desktop\20170404230000.d ...

  4. rabbitmq集群-2

    rabbitmq集群 原文地址:https://www.cnblogs.com/lion.net/p/5725474.html rabbitmq集群介绍 rabbitmq有3种模式,但集群模式是2种. ...

  5. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. tomcat 高并发

    转自 http://blog.csdn.net/feng27156/article/details/19420695 一.容器简化了程序员自身的多线程编程. 各种Web容器,如Tomcat,Resio ...

  7. Qt获取文件路径、文件夹路径

    1.首先是选择文件 QString file_path = QFileDialog::getOpenFileName(this, "请选择文件路径...", "默认路径( ...

  8. HTML-参考手册: 功能排序

    ylbtech-HTML-参考手册: 功能排序 1.返回顶部 1. 功能排序 New : HTML5 新标签 标签 描述 基础   <!DOCTYPE>  定义文档类型. <html ...

  9. 数据库SQL调优的几种方式(转)

    原文地址:https://blog.csdn.net/u010520146/article/details/81161762 在项目中,SQL的调优对项目的性能来讲至关重要,所有掌握常见的SQL调优方 ...

  10. ES6数组中删除指定元素

    知识点: ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. arr.splice(arr.findIndex(item => ...