关闭

HDU5763 another meaning -(KMP+DP)

82人阅读 评论(0) 收藏 举报
分类:

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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11287次
    • 积分:840
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条