【字串】SSL_1216 So many prefix?
阿新 • • 發佈:2018-12-31
題意
給出一個字串,求出字首長度為偶數的子串在這個字串中出現的次數的總和。
思路
我們可以想到動態規劃。設為字首中偶數串出現的次數(包括自己),可得:
其中為中的。
程式碼
#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);
}