先用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. LeetCode 944 Delete Columns to Make Sorted 解题报告

    题目要求 We are given an array A of N lowercase letter strings, all of the same length. Now, we may choo ...

  2. BZOJ3613 南园满地堆轻絮 二分/贪心

    正解:贪心 解题报告: 传送门! 这题似乎是可以二分水过的,,,但数据可以加强一下就能简单把二分卡住了,或者修改下空间限制什么的反正就很容易能卡住 所以这里介绍一个优秀的贪心做法,O(n)的时间复杂度 ...

  3. 【pyqtgraph】pyqtgraph-鼠标互动

    pyqtgraph绘图库官方文档学习-鼠标互动(mouse interaction) 鼠标互动 大多数使用pyqtgraph数据可视化的应用程序都会生成可以使用鼠标进行交互式缩放,平移和配置的小部件. ...

  4. 跨域的问题(nginx解决才是王道)

    跨域分为两类:一时get跨域,而是post跨域.常见的是三种: 一种是jsonp, $.ajax({ url: "http://127.0.0.1/~chenjiebin/mycode/ph ...

  5. springMVC(一): 整体请求过程概述

    首先用户发送请求,DispatcherServlet实现了Servlet接口 获取url请求对应的处理方法,遍历handlerMappings列表,获取对象HandlerExecutionChain( ...

  6. 动态赋id

  7. [MySQL优化2]不用SELECT * FROM table;

    假设有一张employees表,它有8列:员工人数,姓氏,名字,分机,电子邮件,办公室代码,报告,职位等.如果要仅查看员工的名字,姓氏和职位,请使用以下查询:SELECT lastname, firs ...

  8. what's the python之变量、基本数据类型

    what's the 变量? Python 中的变量赋值不需要类型声明. 变量在内存中创建,包括变量的标识,名称和数据. 变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋 ...

  9. 协程.md

    一. # 可迭代l = [ i for i in range(10) ] # l是可迭代的,但不是迭代器for idx in l:    print(idx)    # range是个迭代器for i ...

  10. 由于找不到 MSVCR100.dll,无法继续执行代码

    由于找不到 MSVCR100.dll,无法继续执行代码.重新安装程序可能会解决此问题 360软件管家中找到  进行安装即可