G2. 唐纳德与子串 (Hard)

Time limit per test: 2.5 seconds

Memory limit: 512 megabytes

子串的定义是在一个字符串中连续出现的一段字符。这里,我们使用 s[l…r] 来表示 s 字符串从 l 到 r(闭区间)的子串。在本题中,字符串下标从 0 开始。显然,对于长度为 n 的字符串共有 n(n+1)2 个子串。

对于一个给定的字符串 s,唐纳德给出 q 次询问,第 i 次询问包括三个参数 li,ri,zi,问在 s[li…ri] 的所有子串中共有多少个恰好为 zi。

Input

输入具有如下形式:

sql1 r1 z1l2 r2 z2⋮lq rq zq

第一行一个字符串 s。

第二行一个整数 q。

接下来每行:首先两个整数 li,ri (0≤li≤ri<|s|),然后是一个非空字符串 zi。整数和整数,整数和字符串间以单空格隔开。

字符串中只会出现 26 个小写英文字母。

数据规模约定:

  • 对于 Easy 档:1≤|s|≤100,q≤∑|zi|≤100。
  • 对于 Hard 档:1≤|s|≤105,q≤∑|zi|≤105。

Output

对于每次询问,输出一个整数,表示答案。

Examples

input
thisisagarbagecompetitionhahahah
5
0 30 a
1 5 is
25 30 hah
6 12 ag
7 12 ag

output
6
2
2
2
1
#include <iostream>
#include <cstring>
using namespace std;int l,r,p,sum;
int next[100000];
string s,z;
void gtnext()
{int k=-1,j=0;next[0]=-1;while(j<z.size()){if(k==-1||z[j]==z[k]){j++;k++;if(z[j]!=z[k])next[j]=k;elsenext[j]=next[k];}elsek=next[k];}
}
int kmp()
{int j=l,k=0;while(j<=r){if(k==-1||s[j]==z[k]){j++;k++;}elsek=next[k];if(k==z.size()){sum++;k=next[k];}}cout<<sum<<endl;
}
int main()
{cin>>s;cin>>p;for(int i=0;i<p;++i){sum=0;cin>>l>>r;cin>>z;memset(next,0,sizeof(next));gtnext();kmp();}return 0;
}

G2. 唐纳德与子串 (Hard)kmp相关推荐

  1. 唐纳德与子串 Hard

    G2. 唐纳德与子串 (Hard) Time limit per test: 2.5 seconds Memory limit: 512 megabytes 子串的定义是在一个字符串中连续出现的一段字 ...

  2. 3441. 唐纳德与子串 (Easy)

    单点时限: 1.0 sec 内存限制: 256 MB 子串的定义是在一个字符串中连续出现的一段字符.这里,我们使用 s[l-r] 来表示 s 字符串从 l 到 r(闭区间)的子串.在本题中,字符串下标 ...

  3. YBTOJ:公共子串(KMP)

    文章目录 题目描述 解析 代码 题目描述 解析 我的做法是二分答案,暴力枚举子串,对其他的字符串进行KMP. 复杂度logL*L2 没有一次AC,因为忘记了字符串清零!,否则它会和上次二分的字符串没被 ...

  4. EOJ 唐纳德与子串 (Easy)

    题目链接 Easy档暴力也能解,不过又写了下KMP练练 #include<iostream> #include<string> #include<cstdio> # ...

  5. 找子串替换(kmp)poj1572

    题目链接:http://poj.org/problem?id=1572 输入数据时要注意,这里是string型 用getline(cin,origin[i]); #include <string ...

  6. 算法唯手熟尔(PAT剩余清单 or leetcode)---希望可以日更

    文章目录 2020/3/5 PAT A1119_C 2020/3/6 PAT A1123_C PAT A1115_C PAT A1114_C leetcode 206. 反转链表_C leetcode ...

  7. 字符串匹配のKMP【专题@AbandonZHANG】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

  8. LibreOJ #103. 子串查找

    二次联通门 : LibreOJ #103. 子串查找 /*LibreOJ #103. 子串查找kmp*/ #include <cstdlib> #include <cstring&g ...

  9. KMP模式串匹配+Compress Words CodeForces - 1200E

    题意: 给你若干个字符串,答案串初始为空.第 iii 步将第 iii 个字符串加到答案串的后面,但是尽量地去掉重复部分(即去掉一个最长的.是原答案串的后缀.也是第 iii个串的前缀的字符串),求最后得 ...

最新文章

  1. [bzoj1477]青蛙的约会
  2. C++实现数组中求第K大数
  3. UIControl的子类UISwitch, UISegmentedCntrol, UIPageControl详解
  4. 计算机网络中什么叫总衰耗_1、什么是计算机网络?
  5. SpringBoot日志收集-Aop方式-存进数据库一起来和我看看咋收集日志吧!!
  6. vector的基本操作
  7. 开源视觉salm算法介绍
  8. Linux 内核打印级别
  9. python冒泡排序实验报告_python中的冒泡排序
  10. AngularJS scope 学习
  11. oppoJava面试!java开发视频聊天
  12. Python文件与函数练习题
  13. 用Python全自动播放尔雅网课
  14. 华为以“平台应变”之道角逐数字化转型“深水区”
  15. (一)office文档操作之excel表格模板填充数据导出
  16. Mysql按条件求和Sum函数
  17. U盘文件乱码?修复后U盘文件消失,但仍占有U盘空间?
  18. Python + Django 入门级开发手顺
  19. xss漏洞开源网站包
  20. 24V行车记录仪4Ω抛负载的选型及测试

热门文章

  1. 针对$_SERVER[’PHP_SELF’]的跨站脚本攻击(XSS)
  2. 【新品发布】山海软件生产线pspl,包含了一个开源的混淆器
  3. ODBC的多线程应用
  4. 如何查看Android设备上的分区信息
  5. 基于WINCE6.0的nandflash驱动(基于K9F1G08U0B)
  6. Spark- Checkpoint原理剖析
  7. c#获取电脑硬件信息参数说明(硬盘篇 Win32_DiskDrive)
  8. JAVA学习笔记--初始化与清理
  9. android 如何将电话簿SDN数字和其他普通的数字混合在一起?
  10. 认证服务号可通过模板消息向用户发送重要的服务通知