HDU 5763 Another Meaning (kmp + dp)
2016-07-28 23:04
459 查看
Another Meaning
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5763Description
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.
Limits
T <= 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
4hehehe
hehe
woquxizaolehehe
woquxizaole
hehehehe
hehe
owoadiuhzgneninougur
iehiehieh
Sample Output
Case #1: 3Case #2: 2
Case #3: 5
Case #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”, “hehe”, “hehe*”, “**”, “hehehehe”.
Source
2016 Multi-University Training Contest 4题意:
给出字符串A和B,单词B具有两种解释,求字符串A一共有多少种意义.题解:
考虑A中每个单词B,需要考虑它是否解释为第二种意义;很显然要用DP.首先用kmp处理出A中的每个B,记录每个B的起点和终点(下面的代码记录的是以i为终点的B的起点,没有则为-1).
dp[i]为处理到第i个字符时共有多少种意义:
若i是某个B的终点,则dp[i] = dp[i-1] + dp[起点-1]. (前者为当前B不解释为二义,后者为把B解释为二义).
若i不是终点,则dp[i] = dp[i-1];
值得一提的是:由于背包dp需要用到初始值dp[0],而字符串又从0开始,导致初始值为dp[-1],所以下面的代码特别处理了这个问题.
实际上,应该在读入字符串时空出str[0]来避免这个问题.
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #define LL int #define eps 1e-8 #define maxn 101000 #define mod 1000000007 #define inf 0x3f3f3f3f #define IN freopen("in.txt","r",stdin); using namespace std; char str[maxn],p[maxn]; int f[maxn],cnt; int flag[maxn]; void getf() { memset(f,0,sizeof(f)); memset(flag, -1, sizeof(flag)); int len=strlen(p); for(int i=1;i<len;i++) { int j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=(p[i]==p[j]? j+1:0); } } int ans; void kmp() { getf(); int len1=strlen(str),len2=strlen(p); for(int i=0,j=0;i<len1;i++) { while(j&&str[i]!=p[j]) j=f[j]; if(str[i]==p[j]) j++; if(j==len2) { flag[i] = i-len2+1; ans++; } } } int dp[maxn]; //由于字符串从0开始,这里需要用到dp[-1] = 1; int dps(int i) { if(i<0) return 1; return dp[i]%mod; } int main(int argc, char const *argv[]) { //IN; int t; cin >> t; int ca = 1; while(t--) { ans = 0; scanf("%s", str); scanf("%s", p); kmp(); fill(dp, dp+maxn, 1); int len = strlen(str); int len2 = strlen(p); for(int i=0; i<len; i++) { if(flag[i] == -1) dp[i] = dps(i-1)%mod; else { dp[i] = dps(i-1); dp[i] = (dp[i] + dps(flag[i]-1))%mod; } } printf("Case #%d: %d\n", ca++, dp[len-1]%mod); } return 0; }
相关文章推荐
- ThinkPHP框架基础 创建控制器
- CodeForces 274 A. k-Multiple Free Set
- IIS7/8 HTTP Error 500.19 错误 0x80070021
- POJ 3259 Wormholes
- servlet学习
- IOS-66-NSDateFormatter性能优化
- ios-关于使用高德地图api心得(1)
- Qt 5.7 + VS2015/qt creator 环境配置
- Android 动画
- NBOJv2 Problem 1009 蛤玮的魔法(二分)
- 1051. 复数乘法 (15)
- 底部弹出PopupWindow并且背景变为半透明效果
- 直接插入排序
- Wireshark入门与进阶系列三之远程抓包
- NOI2016 滚粗记
- Android 界面适配
- 在CentOS上编译安装FFmpeg
- LeetCode 228 Summary Ranges
- qemu和gdb的long模式
- jquery生成二维码插件-封装