P3649-[APIO2014]回文串【PAM】
生活随笔
收集整理的這篇文章主要介紹了
P3649-[APIO2014]回文串【PAM】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P3649
題目大意
一個字符串,求最大的回文串長度×出現(xiàn)次數(shù)
解題思路
構(gòu)建出PAM\text{PAM}PAM然后統(tǒng)計一下每個節(jié)點作為后綴的次數(shù),failfailfail樹上上傳一下信息就好了,時間復(fù)雜度O(n)O(n)O(n)。
當(dāng)然也可以SAM+Manacher+\text{SAM}+\text{Manacher}+SAM+Manacher+倍增,因為一個字符串里本質(zhì)不同的回文串就是會讓馬拉車的maxrightmaxrightmaxright增加的回文串,這些最多只有nnn個,馬拉車跑出來的丟到SAM\text{SAM}SAM倍增找到對應(yīng)節(jié)點即可。時間復(fù)雜度O(nlog?n)O(n\log n)O(nlogn)
這里寫的是PAM\text{PAM}PAM
code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=3e5+10; int n,tot,fail[N],len[N],cnt[N],ch[N][26]; char s[N];long long ans; int get_fail(int x,int n){for(;s[n-len[x]-1]!=s[n];)x=fail[x];return x; } int Insert(int n,int x){x=get_fail(x,n);int c=s[n]-'a';if(!ch[x][c]){len[++tot]=len[x]+2;int y=get_fail(fail[x],n);fail[tot]=ch[y][c];ch[x][c]=tot;}cnt[ch[x][c]]++;return ch[x][c]; } int main() {scanf("%s",s+1);n=strlen(s+1);int last=0;len[1]=-1;fail[0]=tot=1;for(int i=1;i<=n;i++)last=Insert(i,last);for(int i=tot;i>=1;i--)cnt[fail[i]]+=cnt[i];for(int i=1;i<=tot;i++)ans=max(ans,1ll*len[i]*cnt[i]);printf("%lld\n",ans); }總結(jié)
以上是生活随笔為你收集整理的P3649-[APIO2014]回文串【PAM】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4718-[模板]Pollard-Rh
- 下一篇: 植物油的主要成分是