sp7586 NUMOFPAL

求一个字符串的回文子串个数。
凡是这类问题,优先考虑麻辣烫。
我们可以发现,依据题意,任意两个对称轴不同的回文串,都是「本质不同」的。
并且,每个回文串,和它对称轴相同的所有子串都必然是回文串。
故而我们先用麻辣烫处理,然后统计一遍即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max(_A,_B) ((_A)>(_B)?(_A):(_B))
#define Min(_A,_B) ((_A)<(_B)?(_A):(_B))
int n,f[200005];
char ch[100005],s[200005];
inline void manacher(){
	int mx=0,nw;
	for(int i=2;i<=n;++i){
		if(i<mx){
			f[i]=Min(f[(nw<<1)-i],f[nw]-(i-nw));
		}else{
			f[i]=1;
		}
		while(s[i+f[i]]==s[i-f[i]]){
			++f[i];
		}
		if(i+f[i]>mx){
			mx=i+f[i];
			nw=i;
		}
	}
}
void init(){
	cin>>(ch+1);
	n=strlen(ch+1);
	s[1]=s[2]='#';
	for(int i=1;i<=n;++i){
		s[(i<<1)+1]=ch[i];
		s[(i<<1)+2]='#';
	}
	n=(n<<1)+2;
	s[n+1]=0;
	manacher();
	int ans=0;
	for(int i=1;i<=n;++i){
		ans+=f[i]/2;
	} 
	printf("%d\n",ans);
}
int main(){
	init();
	return 0;
}

 

发表评论

您的电子邮箱地址不会被公开。