标签:codeforces dp
给出两个字符串,问第一个字符串由多少种方法提取出一些子串使这些子串中都包含t模式串。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007
using namespace std;
char s[MAX],t[MAX];
int mark[MAX];
const int mod = 1e9+7;
int dp[MAX];
int sum[MAX];
void get_next ( char p[] , int next [] )
{
    int i = 0 , k = -1 , len = strlen ( p );
    next[0] = -1;
    while ( i < len )
        if ( k == -1 || p[i] == p[k] )
            i++,k++,next[i]=k;
        else k = next[k];
}
void match ( char s[] , char p[] )
{
    memset ( mark , 0 , sizeof ( mark ) );
    int next[MAX];
    get_next ( p , next );
    int len1 = strlen ( s );
    int len2 = strlen ( p );
    int i = 0 , j = 0;
    while (i < len1 )
    {
        if ( j == -1 || s[i] == p[j] ) i++ , j++;
        else j = next[j];
        if ( j == len2 ) 
            mark[i] = i-len2+1;
    }
}
int main ( )
{
    while ( ~scanf ( "%s" , s ) )
    {
        scanf ( "%s" , t );
        match ( s , t );
        sum[0] = dp[0] = 0;
        int n = strlen ( s ); 
        for ( int i = 1 ; i <= n ; i++ )
            if ( !mark[i] ) 
                mark[i] = mark[i-1];
        for ( int i = 1 ; i <= n ; i++ )
        {
            dp[i] = dp[i-1];
            int l = mark[i];
            if ( !l ) continue;
            dp[i] += (sum[l-1]+l)%mod;
            dp[i] %= mod;
            sum[i] = sum[i-1] + dp[i];
            sum[i] %= mod;
        }
        printf ( "%d\n" , dp[n] );
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
codeforces 494B B. Obsessive String(dp)
标签:codeforces dp
原文地址:http://blog.csdn.net/qq_24451605/article/details/48947325