CSU-ACM2017暑期训练12-KMP H
来源:互联网 发布:win10的80端口被占用 编辑:程序博客网 时间:2024/06/06 20:36
H - 结合dp
As is known to all, in many cases, a word has two meanings. Such as “hehe”, which not only means “hehe”, but also means “excuse me”.Today, ?? is chating with MeiZi online, MeiZi sends a sentence A to ??. ?? is so smart that he knows the word B in the sentence has two meanings. He wants to know how many kinds of meanings MeiZi can express.
Input
The first line of the input gives the number of test cases T; T test cases follow.Each test case contains two strings A and B, A means the sentence MeiZi sends to ??, B means the word B which has two menaings. string only contains lowercase letters.LimitsT <= 30|A| <= 100000|B| <= |A|
Output
For each test case, output one line containing “Case #x: y” (without quotes) , where x is the test case number (starting from 1) and y is the number of the different meaning of this sentence may be. Since this number may be quite large, you should output the answer modulo 1000000007.
Sample Input
4hehehehehewoquxizaolehehewoquxizaoleheheheheheheowoadiuhzgneninouguriehiehieh
Sample Output
Case #1: 3Case #2: 2Case #3: 5Case #4: 1
Hint
In the first case, “ hehehe” can have 3 meaings: “*he”, “he*”, “hehehe”.In the third case, “hehehehe” can have 5 meaings: “*hehe”, “he*he”, “hehe*”, “**”, “hehehehe”.
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <queue>using namespace std;const int maxn = 1e5+10, mod = 1000000007;char s[maxn], ss[maxn];int dp[maxn], Next[maxn], len1, len2;bool vis[maxn];void getNext(){ int len = len2; Next[0] = Next[1] = 0; int j; for(int i = 1; i < len; i++){ j = Next[i]; while(j && s[j] != s[i]) j = Next[j]; if(s[j] == s[i]) Next[i + 1] = j + 1; else Next[i + 1] = 0; }}void KMPSearch(){ getNext(); int len = len1, m = len2; int j = 0; for(int i = 0; i < len; i++){ while(j && ss[i] != s[j]) j = Next[j]; if(ss[i] == s[j]) j++; if(j == m) vis[i+1] = true; }}int main(){#ifdef TESTfreopen("test.txt", "r", stdin);#endif // TEST int T, Case = 1; cin >> T; while(T--){ memset(dp, 0, sizeof(dp)); memset(vis, false, sizeof(vis)); scanf("%s%s", ss, s); len1 = strlen(ss); len2 = strlen(s); KMPSearch(); dp[0] = 1; for(int i = 1; i <= len1; i++){ dp[i] = dp[i - 1]; if(vis[i]) dp[i] = (dp[i] + dp[i - len2]) % mod; } printf("Case #%d: %d\n", Case++, dp[len1]);// cout << dp[len1] << endl; } return 0;}
阅读全文
0 0
- CSU-ACM2017暑期训练12-KMP H
- CSU-ACM2017暑期训练12-KMP D
- CSU-ACM2017暑期训练12-KMP E
- CSU-ACM2017暑期训练12-KMP F
- CSU-ACM2017暑期训练12-KMP G
- CSU-ACM2017暑期训练6-bfs H
- CSU-ACM2017暑期训练3-递推与递归 H
- CSU-ACM2017暑期训练4-dfs H- Square HDU
- CSU-ACM2017暑期训练16-树状数组 H
- CSU-ACM2017暑期训练3 J
- CSU-ACM2017暑期训练4-dfs D
- CSU-ACM2017暑期训练4-dfs E
- CSU-ACM2017暑期训练4-dfs F
- CSU-ACM2017暑期训练4-dfs G
- CSU-ACM2017暑期训练5-三分 E
- CSU-ACM2017暑期训练6-bfs C
- CSU-ACM2017暑期训练6-bfs I
- CSU-ACM2017暑期训练6-bfs G
- FPGA初始化SD卡及其仿真
- socket.io 中文手册 socket.io 中文文档
- 练习 3-4 在数的对二的补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-2^(字长-1)的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。
- 机器学习实战_初识决策树(ID3)算法_理解其python代码(二)
- JAVA实现http/https的Post、Get、代理访问请求
- CSU-ACM2017暑期训练12-KMP H
- A*算法
- chromedriver_selenium_java2(图片,JavaScript)
- C#使用Dropzone.js上传图片
- Nginx性能优化
- Docker介绍
- 练习 3-5 编写函数 itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n, s, 16)把整数n格式化成十六进制整数保存在s中。
- 我的实现_头部
- LeetCode之1.Two Sum