洛谷3804 模板 字尾自動機

2022-05-25 11:24:12 字數 997 閱讀 9283

真·玄學

還是沒有完全搞懂sam的性質啥的啊t^t

我本來以為sam會很長的沒想到這麼短

這個題就是建出sam 然後建樹求出right然後*len[max]直接取max即可啦

學習筆記什麼的等等吧[鴿了我也不管]

附**。

#include#include#include#include#define inf 20021225

#define ll long long

#define mxn 1000100

using namespace std;

struct nodet[mxn*4];

struct edgee[mxn*4];

int poi,lt,rt,cnt,in[mxn*4];char ch[mxn];

void add(int x,int y)

int id(char c)

void insert(int c)

//沒有的話直接連向根

int q=t[p].ch[c];//找到了

if(t[q].len==t[p].len+1)//存在乙個節點長度合適

int nq=++poi;t[nq].len=t[p].len+1;//復刻節點 然後原來的接在復刻的上面

memcpy(t[nq].ch,t[q].ch,sizeof(t[nq].ch));//原本的連線也需要復刻

t[nq].fa=t[q].fa;t[q].fa=t[np].fa=nq;//對於每乙個節點連線到相應的父親

for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq;//修改本來連向原節點的

}void build()//暴力連邊

int ans;

void dfs(int x)//求值

if(t[x].sz!=1) ans=max(ans,t[x].sz*t[x].len);

}int main()

洛谷P3804 模板 字尾自動機

題意 求字串 s 中所有出現次數不為 1 的子串的出現次數乘上該子串長度的最大值。方法 建立sam,令葉子節點 size 等於 1。按照拓撲序從下往上計數。個數大於1的就累計結果。include include include using namespace std define n 1000010...

洛谷P3804 模板 字尾自動機

題目大意 給乙個只包含小寫字母的字串 s 請求出 s 的所有出現次數不為 1 的子串的出現次數乘上該子串長度的最大值。題解 用字尾自動機求出每個字串的長度,排序後求出字串出現次數 字尾自動機是背板的。卡點 1.rnk 陣列沒有開兩倍 板背錯c code include include define ...

洛谷P3804 模板 字尾自動機 SAM

給定乙個只包含小寫字母的字串 s 請你求出 s 的所有出現次數不為 1 的子串的出現次數乘上該子串長度的最大值。s leq 10 6 mathrm t cdots s x t 對於 mathrm t 相同的所有子串 t 我們把他們歸到乙個等價類中,然後對於每乙個等價類建立乙個節點。如果 mathrm...