P5496 模板 回文自動機(PAM)

2021-09-27 02:31:47 字數 1369 閱讀 8384

題目背景

模板題,無背景(其實是我想不出背景)。

題目描述

給定乙個字串 s。保證每個字元為小寫字母。對於 s 的每個位置,請求出以該位置結尾的回文子串個數。

這個字串被進行了加密,除了第乙個字元,其他字元都需要通過上乙個位置的答案來解密。

具體地,若第 ii(i≥1) 個位置的答案是 k,第 i+1 個字元讀入時的 ascii 碼為 c,則第 i+1 個字元實際的 ascii 碼為 (c−97+k)mod26+97。所有字元在加密前後都為小寫字母。

輸入格式

一行乙個字串 s 表示被加密後的串。

輸出格式

一行, ∣s∣ 個整數。第 i個整數表示原串以第 i個字元結尾的回文子串個數。

輸入輸出樣例

輸入 #1

debber

輸出 #1

1 1 1 2 1 1

輸入 #2

lwk輸出 #2

1 1 2

輸入 #3

lxl輸出 #3複製

1 1 1

說明/提示

對於 100% 的資料, 1≤∣s∣≤5×10^5

理解了pam,這題真的很簡單了

**:

#include

#include

#include

#include

#define maxx 500005

#define n 26

using namespace std;

typedef

long

long ll;

int ans[maxx]

,tot;

struct pam

void

init()

inline

intgetfail

(int x)

inline

void

insert

(int c)

last=nex[cur]

[c];

ans[tot++

]=num[last]

; cnt[last]++;

}void

count()

}pam;

char c[maxx]

;int

main()

printf

("%d"

,ans[0]

);for(

int i=

1;i)printf

(" %d"

,ans[i]);

printf

("\n");

return0;

}

題解 洛谷P5496 模板 回文自動機(PAM)

建立pam,當第i個字元插入後,就可以得到以i位置為結尾的回文子串個數 fail樹上奇根到lst的節點個數 不包括奇根 即lst在fail樹上的祖先個數。這個屬性可以在extend時維護,num i num fail i 1.littlefall hello include using namesp...

回文自動機(PAM) 學習筆記

無。強行說和kmp有關也是可以的 1.乙個長度為 n 的字串最多有 n 個本質不同的回文子串。2.對於乙個字串 s,如果在其之後新插入乙個字元,那麼最多產生一種新的回文子串。證明 假設加入這個字元之後得到的最長回文字尾為 t,那麼對於長度小於 t 的任何回文字尾,它們必然在更前面的位置出現過。如圖所...

回文自動機模板

回文自動機每個節點代表了乙個回文串 能求出來的有 1 本質不同的回文串的個數 tot 1 2 每種回文串出現的次數 cnt陣列 3 每種回文串的長度 len陣列 4 以當前節點為字尾的回文串個數 sed陣列 5 每個回文串在原串出現的位置 record陣列 include using namespa...