先用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. scrapy windows下出现importError:No module named 'win32api'

    scrapy windows下出现importError:No module named 'win32api'需安装 pip install pypiwin32

  2. MySQL innodb_flush_method 【转载】

    innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...

  3. composer错误提示Cloning failed using an ssh key for authentication的解决方法

    早上ytkah在测试laravel用composer安装一些插件时出现了一些错误,提示如下,是github的ssh密匙认证错误,提示要重新生成token,然后保存在/root/.config/comp ...

  4. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...

  5. FreeMaker常用表达式

    1,日期转换 ${data.startDate?string("yyyy-MM-dd HH:mm")} 2,非空检查 当数据为null时,1中日期转换在界面上不会显示异常,但在日志 ...

  6. bat/cmd将命令执行的结果赋值给变量

    比如我想把git代码的commitid获取以后加到文件夹上来标记文件夹中的包是哪个git 节点构建得到的. git 命令是git rev-parse --short HEAD 再linux系统下,只需 ...

  7. Elasticsearch5.x批量插入数据(Java)

    先上官方示例代码:官方示例 Java代码: // 批量插入数据 public void InsertBatch() { try { // 设置集群名称 Settings settings = Sett ...

  8. OGeek CTR预估

    特征工程:将所有数据拼接到一起做特征,等到处理完,再按索引拆分数据 1.数据分析 查看标签分布:发现valid与testa.testb的分布相似,说明valid与testa的查询时间比较接近,作为验证 ...

  9. 20165321 实验三 敏捷开发与XP实践

    任务1: 要求: 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题. 在I ...

  10. cocos2d JS-(JavaScript) 几种循环遍历对象的比较

    通常我们会用循环的方式来遍历数组.但是循环是 导致js 性能问题的原因之一.一般我们会采用下几种方式来进行数组的遍历: 方式1: for in 循环: var arr = [1,2,3,4,5]; v ...