题意:给你两个字符串S和T,每次询问(L, R)求出所有满足x<=L, y>=R的(x, y),S串的前x个字符和后y个字符接在一起后包含字符串T的个数之和


说实话。。这题会做题解也还是看不懂

这题瞎搞,主要是难在求不对可能会把答案算重复

设|T| = m,|S| = n;

①对串T求next和kmp

net[q]:表示T串以第q个字符结尾的后缀能匹配的最长前缀

len[i][a]:表示如果T串的前i个字符后面接上字母a,能匹配T的最长前缀(注意不能是整个T串)

cnt[i][j]:等于1表示如果T串的前i个字符后面接上字母j,刚好后缀是T串,很显然除了cnt[m-1][T[m]]其他都为0

②搞定之后就可以对S串dp了

pri[x]:T串在S串的前i个字符中出现pri[i]次

在求前缀和之前:dp[i][j]等于1表示S串以第i个字符结尾的后缀能最长匹配T串的前j个字符(当然j<m,不能满匹配)

也就是说在i相同的时候,有且只有一个j满足dp[i][j]==1,其他dp[i][]都为0

然后dp[i][j] += dp[i-1][j]

③搞定了<=L的前半部分,后半部分其实好办

在求前缀和之前:last[i][j]表示T串的前j个字符接上S串的后i个字符后包含last[i][j]个T串

然后last[i][j] += last[i+1][j]

最后对于每个询问(L, R)答案就是

#include<stdio.h>
#include<string.h>
#define LL long long
int net[105], len[105][26], cnt[105][26], pre[50005], dp[50005][105], last[50005][105];
char str[50005], jud[105];
int main(void)
{LL ans;int T, n, m, p, q, Q, i, j, x, y;scanf("%d", &T);while(T--){scanf("%d%d%d%s%s", &n, &m, &Q, str+1, jud+1);for(i=1;i<=n;i++)str[i] -= 'a';for(i=1;i<=m;i++)jud[i] -= 'a';p = 0;for(q=2;q<=m;q++)                               //net[q]表示以第q个字符结尾的后缀能匹配的最长前缀{while(p && jud[p+1]!=jud[q])p = net[p];if(jud[p+1]==jud[q])p++;net[q] = p;}memset(cnt, 0, sizeof(cnt));for(i=0;i<=m-1;i++){for(j=0;j<26;j++){p = i;while(p && jud[p+1]!=j)p = net[p];if(jud[p+1]==j)p++;len[i][j] = p;                        //len[i][j]表示如果T串的前i个字符后面接上字母j,能匹配T的最长前缀}}cnt[m-1][jud[m]] = 1;         //cnt[i][j]==1表示如果T串的前i个字符后面接上字母j,刚好后缀是T串,很显然只有1种情况len[m-1][jud[m]] = net[m];          //注意特判,能匹配的最长前缀不能是整个T串,很显然就是那1种情况p = q = 0;memset(dp, 0, sizeof(dp));for(i=1;i<=n;i++){q += cnt[p][str[i]];p = len[p][str[i]];pre[i] = pre[i-1]+q;                  //T串在S串的前i个字符中出现pri[i]次dp[i][p] = 1;}for(i=1;i<=n;i++){for(j=0;j<=m-1;j++)dp[i][j] += dp[i-1][j];      //dp[i][j]表示T串的前j个字符作为最长前缀在S串的前i个字符中出现dp[i][j]次(当然j<m,不能满匹配),很显然这是个前缀和}/*for(i=1;i<=n;i++){for(j=0;j<=m-1;j++)printf("%d ", dp[i][j]);printf("\n");}*/memset(last, 0, sizeof(last));for(i=n;i>=1;i--){if(str[i]==jud[m])last[i][m-1]++;for(j=0;j<=m-1;j++)last[i][j] += last[i+1][len[j][str[i]]];                  //last[i][j]表示T串的前j个字符接上S串的后i个字符能形成last[i][j]个完整的T串}for(i=n;i>=1;i--){for(j=0;j<=m-1;j++)last[i][j] += last[i+1][j];                     //再求后缀和}while(Q--){scanf("%d%d", &x, &y);ans = (LL)(n-y+1)*pre[x];for(i=0;i<m;i++)ans += (LL)dp[x][i]*last[y][i];printf("%lld\n", ans);}}return 0;
}
/*
1
8 2 1
pppnotsb
pp
3 8
*/

2017 Multi-University Training Contest - Team 4:1002. Classic Quotation(KMP+DP)相关推荐

  1. 2017 Multi-University Training Contest - Team 7:1008. Hard challenge(模拟)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  2. 2017 Multi-University Training Contest - Team 7:1005. Euler theorem(答案是(n+3)/2)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard 2017 Multi-Univer ...

  3. 2017 Multi-University Training Contest - Team 7:1002. Build a tree(递归)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  4. 2017 Multi-University Training Contest - Team 4:1003. Counting Divisors(积性函数)

    公式: 上面的a|b表示a是b的约数,ai是每个质因数p分解后的项数 枚举每个x(l<=x<=r) 对于每个数暴力分解小于sqrt(r)的质数就好了, 因为大于sqrt(r)的质数最多只有 ...

  5. 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard(...)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  6. 2017 Multi-University Training Contest - Team 7:1010. Just do it(组合数?)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  7. 2017 Multi-University Training Contest - Team 7:1011. Kolakoski(模拟)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  8. 高级软件工程2017第2次作业—— 个人项目:四则运算题目生成程序(基于控制台)...

    Deadline:2017-09-27(周三) 21:00pm (注:以下内容参考 福大软工作业 和集大个人作业 ) 0.前言 很多童鞋在本课程的目标和规划中,都表示希望能提高自己的实践能力. Pra ...

  9. HDU 5794:A Simple Chess(Lucas + DP)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...

最新文章

  1. xiaohai.cf index.php,php des 加密 - 北京破小孩
  2. 200.Number of Islands
  3. YII2 模型关联之 一对多
  4. 旅游自助系统可行性分析
  5. sloth——算法工程师标注数据的福音
  6. 码农创业,6年80万我是这样一步一步实现的,创业朋友共勉[终结篇3年后我再来]...
  7. nurbs非均匀有理B样条实现船体重建
  8. 理解Go 1.5 vendor
  9. 5错误怎么办_“选择不对,一生白费”:如果选错了,该怎么办?记住这两句话...
  10. jquery非常不错的图片切换,多种切换效果
  11. SpringCloud工作笔记054---事物处理_MySQL的四种事务隔离级别_以及修改Mysql默认隔离级别
  12. 做网店大家千万要注意
  13. shedlock 重启系统报错问题_关于国产湖南麒麟LINUX3.3系统兼容性问题
  14. rac部署过程的任务列表
  15. 微服务架构实战(五):选择微服务部署策略
  16. ----解决input输入框type=number时候去除增减按钮 禁用滚轮事件----
  17. Windows 10系统System进程占用CPU过高怎么处理?
  18. 双光耦开关电源电路图_几种常见开关电源电路图
  19. 新浪微博 redis mysql_新浪微博:史上最大的Redis集群
  20. js中var that=this的重要性

热门文章

  1. 语音识别的应用都有哪些
  2. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析
  3. jQuery-dom和jQuery,入口函数(基本知识)
  4. linux box 黑屏,在linux16.04上安装virturalbox的时候出现问题
  5. bae mysql_获取BAE上的MySQL相关信息
  6. dax powerbi 生成表函数_如何用Power BI对数据建模?
  7. 【jQuery 遍历】 - map() 方法
  8. android 的a标签,Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)...
  9. SpringMVC静态资源问题
  10. HDOJ水题集合5:杂题