/*
HDU 6068 - Classic Quotation [ KMP,DP ] | 2017 Multi-University Training Contest 4
题意:
给出两个字符串 S[N], T[M], k个询问
每个询问给出 L,R
对所有 1<=i<=L , r<=j<=N ,
S串拿掉[i+1,j-1]的子串后,剩下两个子串拼在一起的子串中 T 串的数目求和
限制 N,k <= 5e4, M <= 100
分析:
pre[i] 代表 前缀i匹配的T的数目
num[i][j] = 1 代表 前缀i,失配位置为 j
将 pre[i], num[i][j] 求前缀和
suf[i][j] 代表 后缀i,从T[j]开始匹配上的T的数目
ans = pre[L] * (n-R+1) + ∑_[1<=i<=m] num[l][i] * suf[R][i]
所以对于每个询问可 O(m) 时间内求出 pre[i], num[i][j] 可 KMP 过程中求出 设 match[j][k] = 1 代表 T 匹配到 j 时,主串字符为 k 时,新增答案
nxt2[j][k] 代表 T 匹配到 j 时,主串字符为 k 时,下一个失配位置
suf[i][j] = match[j][S[i]] + suf[i+1][nxt[j][S[i]]]
所以 suf可以从后往前 DP
而 match[j][k] 和 nxt2[j][k] 可以 O(m*26) 的时间内暴力求
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 50005;
const int M = 105;
char y[N], x[M];
int nxt[N];
void GetNxt(char x[], int m)
{
int i = 0, j = -1;
nxt[0] = -1;
while (i < m)
{
while (j != -1 && x[i] != x[j]) j = nxt[j];
nxt[++i] = ++j;
}
}
int t, n, m, q;
int pre[N];
int num[N][M];
int suf[N][M];
int nxt2[M][256];
bool match[M][256];
void init()
{
memset(pre, 0, sizeof(pre));
memset(num, 0, sizeof(num));
memset(match, 0, sizeof(match));
memset(suf, 0, sizeof(suf));
int j = 0;
for (int i = 0; i < n; i++)
{
while (j != -1 && y[i] != x[j]) j = nxt[j];
j++;
if (j == m) pre[i]++, j = nxt[j];
num[i][j]++;
pre[i] += pre[i-1];
}
for (int i = 1; i < n; i++)
{
pre[i] += pre[i-1];
for (int j = 0; j < m; j++)
num[i][j] += num[i-1][j];
}
for (int i = 0; i < m; i++)
for (int j = 'a'; j <= 'z'; j++)
{
int k = i;
while (k != -1 && x[k] != j) k = nxt[k];
k++;
if (k == m) match[i][j] = 1, k = nxt[k];
nxt2[i][j] = k;
}
for (int i = n-1; i >= 0; i--)
for (int j = 0; j < m; j++)
suf[i][j] = match[j][y[i]] + suf[i+1][nxt2[j][y[i]]];
for (int i = n-1; i >= 0; i--)
for (int j = 0; j < m; j++)
suf[i][j] += suf[i+1][j];
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d%d", &n, &m, &q);
scanf("%s%s", y, x);
GetNxt(x, m);
init();
while (q--)
{
int l, r; scanf("%d%d", &l, &r);
l--, r--;
long long ans = 1LL * (n-r)*pre[l];
for (int i = 0; i < m; i++)
ans += 1LL * num[l][i] * suf[r][i];
printf("%lld\n", ans);
}
}
}

  

HDU 6068 - Classic Quotation | 2017 Multi-University Training Contest 4的更多相关文章

  1. hdu 6068 Classic Quotation

    题 QAQ http://acm.hdu.edu.cn/showproblem.php?pid=6068 2017 Multi-University Training Contest - Team 4 ...

  2. HDU 6068 Classic Quotation KMP+DP

    Classic Quotation Problem Description When online chatting, we can save what somebody said to form h ...

  3. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  4. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  6. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  7. HDU 4944 FSF’s game(2014 Multi-University Training Contest 7)

    思路:  ans[n]=  ans[n-1] + { (n,1),(n,2).....(n,n)}  现在任务 是 计算  { (n,1),(n,2).....(n,n)}(k=n的任意因子) 很明显 ...

  8. HDU 4940 Destroy Transportation system(2014 Multi-University Training Contest 7)

    思路:无源汇有上下界可行流判定, 原来每条边转化成  下界为D  上界为 D+B   ,判断是否存在可行流即可. 为什么呢?  如果存在可行流  那么说明对于任意的 S 集合流出的肯定等于 流入的, ...

  9. HDU 4627 The Unsolvable Problem 2013 Multi-University Training Contest 3

    给你一个数 n ( 2 <= n <= 109 ),现在需要你找到一对数a, b (a + b = n),并且使得LCM(a, b)尽可能的大,然后输出最大的 LCM(a, b). (为什 ...

随机推荐

  1. java获取单张网页中img标签中的src

    /** * 得到网页中图片的地址 */ public static List<String> getImgStr(String htmlStr) { List<String> ...

  2. 对称加密、非对称加密、数字签名、数字证书、SSL是什么

    非对称密钥加解密 对于一份数据,通过一种算法,基于传入的密钥(一串由数字或字符组成的字符串,也称key),将明文数据转换成了不可阅读的密文,这就是“加密”,同样的,密文到达目的地后,需要再以相应的算法 ...

  3. Zookeeper快速开始

    具体部署流程: #下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5. ...

  4. selenium模块基础用法详解

    目录 selenium模块 官方文档 介绍 安装 有界面浏览器 无界浏览器 selenium+谷歌浏览器headless模式 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 隐式 ...

  5. volatile 关键字(修饰变量)

    目录 volatile 关键字(修饰变量) 1. 含义 2. 作用 3. 如何保证可见性 4. 如何禁止指令重排序优化 5. volatile 是不安全的 6. volatile 不适用场景 vola ...

  6. List和Dictionary互转

    // 声明Dictionary并初始化 Dictionary<string, string> dic = new Dictionary<string, string>() { ...

  7. mac 在finder上面显示完成路径

    打开终端,输入以下命令并回车: defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES 然后再把finder关了再打开,你会 ...

  8. arcgis 服务网页打开需要输入用户名和密码问题解决

    解决方法: 在站点manager中,检查服务的安全性,确认是否是公共.如果不是,设置为公共,面向任何人:如果服务已经被设置为面向公共,那么先设置为私有,面向所选用户,然后再设置为公共,面向任何人 如果 ...

  9. vue学习(7)-路由抽离

    cnpm i vue-router -S

  10. 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索

    需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID. 现在客户的需求是使用这个字段作为过滤条件进行 ...