HDU5763 another meaning -(KMP+DP)

原创 2016年08月28日 16:09:50

Description

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

4
hehehe
hehe
woquxizaolehehe
woquxizaole
hehehehe
hehe
owoadiuhzgneninougur
iehiehieh

Sample Output

Case #1: 3
Case #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”, “he*he”, “hehe*”, “**”, “hehehehe”.


dp[i]表示前i个字符组成的字符串所表示的意思数量,则当匹配时dp[i]=dp[i-1]+dp[i-lenb],不匹配时dp[i]=dp[i-1]。匹配的判断可以用KMP。


#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e5+3;
const int mod=1e9+7;
char a[N],b[N];
ll dp[N];
int lena,lenb,next[N];
void get_next()
{
    int j = 0 ,k = -1;
    next[0] = -1;
    while(j < lenb)
    {
        if(k == -1 || b[j] == b[k])
        {
            j++,k++;
            next[j] = k;
        }
        else k = next[k];
    }
}
void kmp()
{
    get_next();
    int i = 0 ,j = 0;
    memset(dp,0,sizeof(dp));
    dp[0] = 1;
    while(i<lena)
    {
        if(j == -1||a[i]==b[j])
        {
            i++;
            dp[i] = dp[i-1];
            j++;
        }
        else j = next[j];
        if(j == lenb)
        {
            dp[i] = (dp[i-lenb] + dp[i]) % mod;
            j = next[j];
        }
    }
}
int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s %s",a,b);
        lena=strlen(a),lenb=strlen(b);
        kmp();
        printf("Case #%d: %lld\n",cas++,dp[lena]);
    }
    return 0;
}


HDU - 5763 Another Meaning(KMP+DP)

HDU - 5763

HDU 5763 Another Meaning(KMP+DP)

对于给定的字符串A 以及字符串B 已知B字符串可以被替换 问总共有多少种替换的方式 对于A中存在的B的连续子串,这个显然需要用KMP处理出每个B子串的位置 然后问题变成了dp dp[i]为 前i个...
  • pootree
  • pootree
  • 2016年09月09日 15:13
  • 169

hdu5763 Another Meaning(kmp+dp)

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

利用dp计算方案数(hdu 5763 ( Another Meaning ) )

dp的特点与数学归纳法近似,都是已知当前点推导下一个点。 很多时候dp 都会被用在统计个数上。 即在现有的元素中再加上新的元素后个数是如何变化的...

【动态规划】【KMP】HDU 5763 Another Meaning

题目链接:   http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意:   T组数据,给两个字符串s1,s2(len 题目思路:   【动态规划】【K...

DP-HDU-5763-Another Meaning

Another MeaningTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...

HDU Another Meaning DP+KMP

Another MeaningTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...

HDU5763 Another Meaning

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 【题意】给定A,B两个字符串,B串有两个含义,问A串可能有几个含义。 【分析...

(2016多校联赛)hdu 5763 Another Meaning

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: 给你两个字符串a,b,其中b字符串有两种意思,a串中也许有包含b...

HDU5763 Another Meaning动态规划

题目链接:HDU5763 Another Meaning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/655...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU5763 another meaning -(KMP+DP)
举报原因:
原因补充:

(最多只允许输入30个字)