洛谷P3804 模板 字尾自動機

2022-05-24 02:12:10 字數 960 閱讀 6631

題目大意:給乙個只包含小寫字母的字串 $s$ ,

請求出 $s$ 的所有出現次數不為 $1$ 的子串的出現次數乘上該子串長度的最大值。

題解:用字尾自動機求出每個字串的長度,排序後求出字串出現次數(字尾自動機是背板的。。。)

卡點:1.$rnk$陣列沒有開兩倍

板背錯c++ code:

#include #include #define maxn 1000010

using namespace std;

char s[maxn << 1];

int nxt[maxn << 1][26], fail[maxn << 1], r[maxn << 1];

int sz[maxn << 1];

int b[maxn], rnk[maxn << 1];

int root, np, p, cnt, t, last, len;

long long ans = -1;

inline long long max(long long a, long long b)

void insert(int ch)

if (r[t = nxt[p][ch]] == r[p] + 1)

r[np = ++cnt] = r[p] + 1;

for (int i = 0; i < 26; i++) nxt[np][i] = nxt[t][i];

for (fail[np] = fail[t], fail[t] = fail[now] = np; nxt[p][ch] == t; p = fail[p]) nxt[p][ch] = np;

}int main()

printf("%lld\n", ans);

return 0;

}

洛谷P3804 模板 字尾自動機

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

洛谷 P3804 字尾自動機

給定乙個只包含小寫字母的字串ss 請你求出 ss 的所有出現次數不為 11 的子串的出現次數乘上該子串長度的最大值。輸入格式 一行乙個僅包含小寫字母的字串ss 輸出格式 乙個整數,為 所求答案 輸入樣例 1 abab 輸出樣例 1 4 對於10 10 的資料,s 1000 s 1000 對於100 ...

洛谷P3804 模板 字尾自動機 SAM

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