HDU 6230 (Manacher&BIT)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6230 (Manacher&BIT)相关的知识,希望对你有一定的参考价值。

HDU 6230 (Manacher&BIT)

依据题意可知,我们需要找到满足两个相交的回文串。

分为几个步骤:

1.求出每个位置的最大回文半径。

2.判断每个位置的贡献。

3.求和.

我们从小到大枚举位置 i i i

对于 i i i需要满足的 j j j的条件有:

j − p [ j ] + 1 ≤ i i + p [ i ] − 1 ≥ j j-p[j]+1\\le i\\\\i+p[i]-1\\ge j jp[j]+1ii+p[i]1j

注意到 i i i是单调的,我们可以对 j − p [ j ] j-p[j] jp[j]预处理然后排序,然后用一个BIT维护计算贡献。

这样时间复杂度是: O ( n + n l o g n ) O(n+nlogn) O(n+nlogn)

// Problem: A - Palindrome
// Contest: Virtual Judge - 2017CCPC 哈尔滨 [Cloned]
// URL: https://vjudge.net/contest/435963#problem/A
// Memory Limit: 262 MB
// Time Limit: 3000 ms
// Date: 2021-05-04 23:21:44
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=5e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
#define lowbit(x) x&(-x)
ll s[N];
int n;
void upd(int x,int v){
	while(x<=n){
		s[x]+=v;x+=lowbit(x);
	}return;
}
ll que(int x){
	ll ans=0;
	while(x){
		ans+=s[x];x-=lowbit(x);
	}return ans;
}
char a[N];
int p[N];
void Manacher(){
	scanf("%s",a+1);
	n=strlen(a+1);
	int mx,id;
	mx = id = 0;
	mst(p,0);
	mst(s,0);
	for(int i=1;i<=n;i++){
		p[i]=(mx>i)?min(p[2*id-i],mx-i):1;
		while(a[i+p[i]]==a[i-p[i]]) p[i]++;
		if(i+p[i]>mx) mx=i+p[i],id=i;
	}	
}
int main(){
	int t;scanf("%d",&t);
	while(t--){
		Manacher();
		priority_queue<PII,vector<PII> ,greater<PII> >q;
		ll ans=0;
		for(int i=1;i<=n;i++) q.push({i-p[i],i});
		for(int i=1;i<=n;i++){
			while(!q.empty()&&q.top().fi<i){
				int y=q.top().se;
				q.pop();
				upd(y,1);
			}
			ans+=que(i+p[i]-1)-que(i);
		}
		printf("%lld\\n",ans);
	}
	return 0;
}

以上是关于HDU 6230 (Manacher&BIT)的主要内容,如果未能解决你的问题,请参考以下文章

hdu6230(求限制条件的回文个数,利用manacher+BIT求解)

2017CCPC-哈尔滨站 Hdu-6230 Palindrome Manacher 主席树

HDU 3068 &&HDU 3294 +最长回文串*3—— manacher/扩展KMP/DP

[manacher] hdu 3294 Girls&#39; research

hdu5371Hotaru&#39;s problem manacher算法

HDU 3068 最长回文(Manacher)