Description
![](https://i-blog.csdnimg.cn/blog_migrate/bf2093ba6054d2b7467c729f71113b4b.png)
Input
![](https://i-blog.csdnimg.cn/blog_migrate/938fc783bae52a355cfd9cf834ce4a08.png)
Output
![](https://i-blog.csdnimg.cn/blog_migrate/52bb0e9c8d8313162a8cf2d85a706bcc.png)
Sample Input
样例一: abababc 样例二: isdashagayisdashagaydashisnotagaydashisnotagay
Sample Output
样例一: 6 样例二: 30
Data Constraint
![](https://i-blog.csdnimg.cn/blog_migrate/d20f424d6dfc881053c9442041a91894.png)
题解
-
首先显然的是从第一位开始,每个偶数位对应的前缀一定是一个答案,那我们记f[i]=1(i%2==0)
-
然后我们考虑KMP的过程,后面串匹配前缀,所以如果他能匹配到一个偶数,也就是说nxt[j]=i(i%2==0)
-
那么我们就可以发现这个字符串对应的肯定是一个长度为偶数的前缀,那么直接累加就好了
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 int next[200010],f[200010],len,j,ans; 6 char ch[200010]; 7 int main() 8 { 9 scanf("%s",ch+1),len=strlen(ch+1); 10 for (int i=2;i<=len;i++) 11 { 12 while (j>0&&ch[j+1]!=ch[i]) j=next[j]; 13 if (ch[j+1]==ch[i]) j++; 14 next[i]=j; 15 } 16 for (int i=2;i<=len;i++) 17 { 18 if (i%2==0) f[i]++; 19 f[i]+=f[next[i]],ans+=f[i]; 20 } 21 printf("%d",ans); 22 }