1. 程式人生 > >ssl1217.So many prefix?

ssl1217.So many prefix?

題目

在這裡插入圖片描述 在這裡插入圖片描述

題解

發現是一道變了形的kmp 然後用一下快讀,再觀察一下樣例,然後上kmp

程式碼

#include <cstdio>
#include <cstring>

using namespace std;

int s[200005],n;
int ne[200005];
long long f[200005],d[200005];

void read(){
	char c;
	c=getchar();
	while (c<'a'||c>'z') c=getchar();
	while (c>='a'&&c<='z') {
		s[++n]=c-'a'+1;
		c=getchar();
	}
}

int main(){
	read();
	for (int i=2,j=0;i<=n;i++){
	    f[i]=f[i-1];
		while (s[i]!=s[j+1]&&j) j=ne[j];		
		if (j) d[i]=d[j+1];
		if (i%2==0) d[i]++;
		f[i]+=d[i];
		if (s[i]==s[j+1]) ne[i]=j+1,j++;
		
	}
	printf("%d",f[n]);
}