2018-2019 ACM-ICPC, Asia Nanjing Regional Contest M

2018-2019 ACM-ICPC, Asia Nanjing Regional Contest M

扩展KMP+马拉车回文串

s:ababa

t:aba

题意:将第一个字符串的一个字串,与第二个字符串从 (0-k)的字符连在一起可以成为回文字符串,且第一个字符串字串的长度比第二个字符串的长度要大。

要构成的的回文字符串 两部分构成   s' 第一个字符串的字串,和第二个字符串的前缀t',构成一个回文字符串。

那么如果把第一个字符串倒过来, 那就相当于,s' 的一部分是和 t'是相同的,s'还有一部分是回文字符串。

那么s'与t'相同的长度   * 从当前位置能够产生的回文串数量,就相当能够构成的回文串个数。

#include
using namespace std;
typedef long long LL;
#define debug(x) cout<<"["<i?std::min(Mp[2*id-i],mx-i):1;
        while(i-Mp[i]>=0&&Ma[i+Mp[i]]==Ma[i-Mp[i]]) Mp[i]++;
        if(i+Mp[i]>mx) {
            mx=i+Mp[i];
            id=i;
        }
    }
    for(int i=0; i0) dp[i-1]--;
    }
    for(int i=l-1; i>=0; i--) {
        dp[i]+=dp[i+1];
    }
    for(int i=0; i

 

你可能感兴趣的:(-----字符串-----)