题意
给出一个字符串,求出前缀长度为偶数的子串在这个字符串中出现的次数的总和。
思路
我们可以想到动态规划。设f[i]f[i]f[i]为前缀1∼i1\sim i1∼i中偶数串出现的次数(包括自己),可得:
f[i]=f[next[i]]+(i%2==0)f[i]=f[next[i]]+(i\%2==0)f[i]=f[next[i]]+(i%2==0)
其中next[i]next[i]next[i]为KMPKMPKMP中的next数组next数组next数组。
代码
#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);
}