先用KMP重叠匹配求出各个匹配成功的尾串位置。然后利用DP去求,那转移方程应该是等于

  上一个状态                                        (无法匹配新尾巴)

  上一个状态 + 以本次匹配起点为结尾的状态(就是说有了新的位置) + 1 (单单一个新串)       (匹配成功)

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5 + ;
const int mod = ;
long long dp[maxn];
char str1[maxn], str2[maxn];
bool flag[maxn];
/*
* nex[] 的含义:x[i-nex[i]...i-1]=x[0...nex[i]-1]
* nex[i] 为满足 x[i-z...i-1]=x[0...z-1] 的最大 z 值(就是 x 的自身匹配)
*/
void kmp_pre(char x[], int m, int kmpNext[]) {
int i, j;
j = kmpNext[] = - ;
i = ;
while(i < m) {
while( - != j && x[i] != x[j])
j = kmpNext[j];
kmpNext[++i] = ++j;
}
}
/*
* kmpNext[i] 的意思:nex'[i]=nex[nex[...[nex[i]]]](直到
nex'[i]<0 或者 x[nex'[i]]!=x[i])
* 这样的预处理可以快一些
*/
void preKMP(char x[], int m, int kmpNext[]) {
int i, j;
j = kmpNext[] = - ;
i = ;
while(i < m) {
while( - != j && x[i] != x[j])
j = kmpNext[j];
if(x[++i] == x[++j])
kmpNext[i] = kmpNext[j];
else
kmpNext[i] = j;
}
}
/*
* 返回 x 在 y 中出现的次数,可以重叠
*/
int nex[];
int KMP_Count(char x[], int m, char y[], int n) { //x 是模式串,y 是主串
int i, j;
int ans = ;
//preKMP(x,m,nex);
kmp_pre(x, m, nex);
i = j = ;
while(i < n) {
while( - != j && y[i] != x[j])
j = nex[j];
i++;
j++;
if(j >= m) {
ans++;
flag[i] = ;
j = nex[j];
}
}
return ans;
}
int main() {
int T, ncase = ;
scanf("%d", &T);
while(T --) {
scanf("%s%s", str1, str2);
int l1 = strlen(str1);
int l2 = strlen(str2);
memset(flag, , sizeof(flag));
memset(dp, , sizeof(dp));
KMP_Count(str2, l2, str1, l1);
for(int i = l2; i <= l1; i ++)
dp[i] = flag[i] ? (dp[i - ] + dp[i - l2] + ) % mod : dp[i - ];
printf("Case #%d: %lld\n",ncase++,(dp[l1] + )%mod);
}
return ;
}

Another Meaning (KMP + DP)的更多相关文章

  1. HDU 5763 Another Meaning KMP+DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Another Meaning Time Limit: 2000/1000 MS (Java/ ...

  2. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  3. POJ 3336 Count the string (KMP+DP,好题)

    参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...

  4. 【KMP+DP】Count the string

    KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that A ...

  5. codeforces432D Prefixes and Suffixes(kmp+dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a strin ...

  6. [kmp+dp] hdu 4628 Pieces

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...

  7. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  8. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  9. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

随机推荐

  1. es6学习笔记入门总结

    1.let const block 作用域 let 代替var 来声明块级作用域,没有变量提升,只在块内有作用 const 可以声明一个常量,类似于指针,指向某一个引用,这个常量并非一成不变的,但是不 ...

  2. LeetCode 669 Trim a Binary Search Tree 解题报告

    题目要求 Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so t ...

  3. 《mongoDB》查询

    一:简单查询 db.collection.find(query, projection) - query :可选,使用查询操作符指定查询条件 - projection :可选,使用投影操作符指定返回的 ...

  4. JS实现倒计时(天数,时,分,秒)

    <!DOCTYPE html> <html> <head>   <meta charset="utf-8" >   <titl ...

  5. 【Python全栈-JavaScript】JavaScript入门

    JavaScript基础知识点 一.JavaScript概述 参考:http://www.w3school.com.cn/b.asp JavaScript的历史 1.1992年Nombas开发出C-m ...

  6. fork多线程进程时的坑(转)

    add : 在fork多线程的进程时,创建的子进程只包含一个线程,该线程是调用fork函数的那个线程的副本.在man fork中,有The child process is created with ...

  7. EXPLAIN执行计划中要重点关注哪些要素(叶金荣)

    原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...

  8. 【SQL】where 后不可以接聚合函数,都哪些是聚合函数?

    where 后不可以接聚合函数,比如函数:SUM(count),AVG(count),MIN(count),MAX(count)

  9. .NET Core 用 VS Code新建各种类型的项目

    用命令行找个地方, 建立目录, 然后执行一下dotnet new --help命令, 查看一下建项目的帮助: 那我建立一个不带用户验证的mvc项目: dotnet new mvc --auth Non ...

  10. centos7 管理开机启动:systemd

    一.CentOS7 systemd 介绍 在 CentOS7 中,使用 systemd 来管理其他服务是否开机启动,systemctl 是 systemd 服务的命令行工具 [root@mysql ~ ...