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