刷題 洛谷 P3804 模板 字尾自動機

2022-05-26 02:42:17 字數 1187 閱讀 9769

給定乙個只包含小寫字母的字串 \(s\) ,

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

輸入格式:

一行乙個僅包含小寫字母的字串 \(s\)

輸出格式:

乙個整數,為所求答案

輸入樣例#1:

abab
輸出樣例#1:

4
對於 \(10\%\) 的資料, \(|s| \leq 1000\)

對於 \(100\%\) 的資料,\(|s| \leq 10^6\)

sam模板題

建出sam後,統計子樹和算每個狀態最長子串的出現次數,根據貪心,由於題目求的是同乙個子串的出現次數和長度的乘積,所以在同乙個狀態的子串,出現次數相同,那麼只要選最長的就行了

於是基數排序搞出拓撲序,統計一下就好了

#include#define ui unsigned int

#define ll long long

#define db double

#define ld long double

#define ull unsigned long long

const int maxn=1000000+10;

int n,las=1,tot=1,len[maxn<<1],ch[maxn<<1][30],fa[maxn<<1],cnt[maxn],rk[maxn<<1],size[maxn<<1];

ll ans;

char s[maxn];

templateinline void read(t &x)

templateinline void write(t x,char ch='\0')

templateinline void chkmin(t &x,t y)

templateinline t min(t x,t y)

inline void extend(int c)

} size[np]=1;

}int main()

write(ans,'\n');

return 0;

}

洛谷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 字尾自動機

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