1. 程式人生 > >【字串】SSL_1216 So many prefix?

【字串】SSL_1216 So many prefix?

題意

給出一個字串,求出字首長度為偶數的子串在這個字串中出現的次數的總和。

思路

我們可以想到動態規劃。設f[i]f[i]為字首1i1\sim i中偶數串出現的次數(包括自己),可得:
f[i]=f[next[i]]+(i%2==0)f[i]=f[next[i]]+(i\%2==0)
其中next[i]next[i]KMPKMP中的nextnext陣列

程式碼

#include<cstdio>
#include<cstring>
using namespace std;

char
a[200001]; int next[200001], f[200001]; int l, ans; int main() { scanf("%s", a + 1); l = strlen(a + 1); int j = 0; for (int i = 2; i <= l; i++) { while (a[i] != a[j + 1] && j) j = next[j]; if (a[i] == a[j + 1]) j++; next[i] = j; f[i] = f[next[i]] + (i % 2 == 0);//加上自己是偶數串的情況 ans += f[i]
; } printf("%d ", ans); }