[Manacher+bit]Palindrome
2017-05-16 18:06
113 查看
https://nanti.jisuanke.com/t/15428
题目大意:离散表示的字符串,求其最长回文串长度。
解题关键:若只用Manacher算法,在统计sum时会超时,所以加一个树状数组来维护前n项和,即可AC。
注意进行Manacher时,i是从1开始的,不要小也不要大。
n天后更新:以前一直没搞清离线与动态维护的区别,今天终于理解了,此题可以开始直接离线求前n项和,因为以后不再改变,所以此题不需要bit维护。直接用一个数组统计一下前n项和即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node{ ll num; char ch; }s[100010]; ll p[110010],sum[110010],bit[110010]; ll t,n,a,k,id,maxlen,tt; ll read(ll i){ ll res=0; while(i){ res+=bit[i]; i-=i&-i; } return res; } void add1(ll i,ll x){ while(i<110010){ bit[i]+=x; i+=i&-i; } } int main(){ scanf("%lld",&t); while(t--){ memset(p,0,sizeof p); memset(bit,0,sizeof bit); memset(s,0,sizeof s); memset(sum,0,sizeof sum); scanf("%lld",&n); k=0; for(int i=0;i<n;i++){ k++; //cin>>s[k].num>>s[k].ch; scanf("%lld %c",&s[k].num,&s[k].ch); tt=s[k].num; if(s[k].ch==s[k-1].ch){ s[k-1].num+=s[k].num; k--; } add1(k,tt); } id=0,maxlen=0; s[0].ch='*',s[k+1].ch='#'; for(int i=1;i<=k;i++){ if(p[id]+id>i) p[i]=min(p[2*id-i],p[id]+id-i); else p[i]=1; while(s[i-p[i]].ch==s[i+p[i]].ch&&s[i-p[i]].num==s[i+p[i]].num)++p[i]; if(p[i]+i>p[id]+id) id=i; sum[i]=read(i+p[i]-1)-read(i-p[i]); if(s[i-p[i]].ch==s[i+p[i]].ch) sum[i]+=2*min(s[i-p[i]].num,s[i+p[i]].num); maxlen=max(maxlen,sum[i]); } printf("%lld\n",maxlen); } return 0; }
相关文章推荐
- 2017 CCPC 哈尔滨 A (hdu 6230) Palindrome (Manacher + BIT)
- POJ - 3974 Palindrome(manacher)
- Ural——1297Palindrome(Manacher)
- hdu3068 Manacher --> find the longest palindrome
- Palindrome---poj3974(最大回文子串manacher)
- POJ3974 Palindrome(Manacher)
- 【Manacher】 POJ 3974 Palindrome
- POJ 3974 - Palindrome(manacher)
- POJ 3974 Palindrome(manacher)
- poj3974 Palindrome(manacher)
- Palindrome----Manacher
- POJ 3974 Palindrome【最长回文串(Manacher模板)】
- 【Ural 1297】Palindrome manacher 最长回文子串
- POJ-3974-Palindrome- Manacher 马拉车算法(On寻找最长回文串)
- POJ 3974 Palindrome Manacher
- poj 3974 Palindrome(manacher)
- POJ 3974 Palindrome(Manacher)
- 【manacher算法】POJ 3974 Palindrome
- POJ 3974 Palindrome 求最长回文子串 Manacher
- [poj3974]Palindrome_Manacher