SPOJ NSUBSTR 字尾自動機 DP

2021-08-08 04:41:49 字數 886 閱讀 8768

給乙個長度為s的字串,問長度為1-s的子串最多出現了多少次。

dp其實是非常簡單的。。。主要就是乙個字尾自動機的模板,敲對了就行。至於演算法,認真觀察字尾自動機,對字尾自動機理解透徹了就發現這是一道模板題。對於這道題,我發現的規律就是,對於乙個點我們很容易算出來出現次數,然後的話我們可以看一下這個點對應的字串最長長度是多少,那麼小於等於這個長度的所有字串出現次數最少為這個點的出現次數(rt陣列)。

#include 

#define up(i,l,h) for(int i=l;i#define down(i,h,l) for(int i=h-1;i>=l;i--)

#define w(t) while(t)

#define mem(a,b) memset(a,b,sizeof(a))

#define maxn 350010

using

namespace

std;

static

const

int node=maxn<<1,c=26;

char s[maxn];

int dp[maxn];

struct suffixauto

void init()

void extend(int c)

}last=np;

}void topsort()

};suffixauto sa;

int main()

sa.topsort();

up(i,1,sa.allc+1)

down(i,len,1) dp[i]=max(dp[i+1],dp[i]);

up(i,1,len+1) printf("%d\n",dp[i]);

}}

字尾樹與字尾自動機

先學習的是字尾樹向的字尾自動機qaq 介紹字尾樹的定義 把所有字尾插到trie裡 然而實際上是插到trie裡之後再壓縮掉一些邊,這樣就是字尾樹了。但我們發現如果乙個乙個找的話複雜度是o n2 我們考慮倒著建立字尾樹,即 串s a s 那麼我們先建立s 的字尾樹,然後建立a s 的字尾樹。這樣的話我們...

模板 字尾陣列 字尾自動機

關於字尾自動機sam,貼乙個非常好的講解 字尾自動機學習小記 交洛谷模板可a 傳送門 洛谷 模板 字尾排序 include using namespace std const int n 1e6 5 char s n int sa n t1 n t2 n c n int n,m 555 void s...

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...