1706 子串之王

描述          

最近几天,Dazzling学了KMP
嗯,很强大的算法
现在,问题来了,这个看似KMP的问题到底是不是KMP呢?

输入

T组数据,每组数据包含两个字符串X及Z
X长度保证小于1000
Z长度保证小于100
结果保证在int范围以内

输出

输出Z在X中出现的次数,注意,出现时不必相连
e.g.X=bagbagg
Z=bag
则Z在X中出现的下标分别为
<0,1,2>
<0,1,5>
<0,1,6>
<0,4,5>
<0,4,6>
<3,4,5>
<3,4,6>
因此,共出现7次

样例输入
2
bagbagg
bag
aaaaa
aa
样例输出
7
10
#include <iostream>
#include <cstring>
using namespace std;
int dp[1002][102];
int main()
{
    int t;
    cin >> t;
    int i, j;
    while(t --)
    {
        char X[1002], Z[102];
        cin >> X;
        cin >> Z;
        if(X[0] == Z[0])
            dp[0][0] = 1;
        else
            dp[0][0] = 0;
        for(i = 1; i < strlen(X); i ++)
        {
            if(X[i] == Z[0])
                dp[i][0] = dp[i-1][0] + 1;
            else
                dp[i][0] = dp[i-1][0];
            for(j = 1; j < strlen(Z); j ++)
            {
                if(j > i) dp[i][j] = 0;
                if(X[i] == Z[j])
                    dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
                else
                    dp[i][j] = dp[i-1][j];
            }
        }
        cout << dp[strlen(X)-1][strlen(Z)-1] << '\n';
    }
    return 0;
}

你可能感兴趣的:(算法)