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 j−p[j]+1≤ii+p[i]−1≥j
注意到 i i i是单调的,我们可以对 j − p [ j ] j-p[j] j−p[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' research