一本通學習筆記 字典樹與 0 1 Trie

2022-06-07 07:12:08 字數 4527 閱讀 5339

字典樹中根到每個結點對應原串集合的乙個字首,這個字首由路徑上所有轉移邊對應的字母構成。我們可以對每個結點維護一些需要的資訊,這樣即可以去做很多事情。

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

1000005

];

int ind=0

; node*newnode()

void

clear()

void insert(string

s) }

int query(string

s)

return pos->val;

}string str[10005

];

void

solve()

int flag=0

;

for(int i=1;i<=n;i++)

}if(flag) cout<<"no"

yes"

<}

}int

main()

0-1 trie通常用於異或相關的問題,思路是記錄所有01串後,我們找最大異或和的時候可以從高位到低位貪心,此時trie發揮的作用就是在當前字首已經選擇的情況下,能使得正在考慮位異或為1的字尾是否存在。

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

4000005

];int

ind;

node *newnode()

void insert(int

x) }

int query(int

x)

return

ans;

}int a[1000005

];void

solve()

} //

namespace trie

intmain()

看到這個算式我們很容易想到字首和轉化。問題轉化為求s[r1]^s[l1-1] + s[r2]^s[l2-1]最大。

由於要r1

max

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

8000005

];int

ind;

node *newnode()

void insert(int

x) }

int query(int

x)

return

ans;

}int a[1000005], pre[1000005], suf[1000005

];void

solve()

} //

namespace trie

intmain()

和前面那題一樣

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

1000005

];int ind = 0

;node *newnode()

void

clear()

void insert(string

s) }

int query(string

s)

return pos->val;

}string str[10005

];bool solve(int

t) --n;

if (n <= 0

)

return

false

;

int flag = 0

;

for (int i = 1; i <= n; i++)

}if(flag)

cout

<< "

set

"<< t << "

is not immediately decodable

"

cout

<< "

set

"<< t << "

is immediately decodable

"

true;}

} //

namespace trie

intmain()

我們記錄u[i]表示文章的每乙個字首s[1..i]是否可被理解。做乙個類似dp的處理即可。

剛開始忘記傳引用t了半天……

#include using

namespace

std;

char buf[1000005

];void readstr(string &tar)

int __cnt = 0

;namespace

trie

};node *root;

node pool[

5000005

];int u[1000005

];int ind = 0, ans = 0

;node *newnode()

void

clear()

void insert(string &s)

pos->val++;

}void query(string &s, int

start)

}string str[1005

];string

art;

void

solve()

for (int i = 1; i <= m; i++)

cout

<< ans <}

}}

//namespace trie

intmain()

對資訊建trie,仍然是在每個串的結束點上打標記。結果就等於把密碼串丟上去跑,跑的路徑上的標記和,加上最終停在的結點(如果整個密碼串都成功匹配)的子樹的標記和。前乙個直接記錄,後乙個用樹上字首和預處理一下即可。

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

1000005

];int ind = 0

;node *newnode()

void

clear()

void insert(int

len)

pos->val++;

}void dfs(node *p)

int query(int

len)

pos = pos->ch[si];

}return ans + pos->sum;

}string str[10005

];void

solve()

dfs(root);

for (int i = 1; i <= n; i++)

}}

//namespace trie

intmain()

樹上字首異或和以後直接轉化為兩點最大異或和。其實用尤拉序也可以。

#include using

namespace

std;

namespace

trie

};node *root;

node pool[

4000005

];

intind;

node*newnode()

void insert(int

x) }

int query(int

x)

return

ans;

}int a[1000005

];

void solve(int

n) }

int n,vis[1000005

];vector

int,int> > g[1000005

];void dfs(int

p) }

}int

main()

dfs(1);

trie::solve(n);

}

一本通學習筆記 樹鏈剖分

loj上只掛了兩個無重的題,本來心想水一下,結果被sdoi2011染色那題卡了一發。儘管這題之前做過,但實現很不優美。今天wa的第一發一開始測樣例就掛了,強行除錯半天交上去一分沒有。後來仔細想了想怎樣寫比較清楚 儘管看起來好像有點冗餘 寫好以後一路順風一發就過。從這裡也有點感悟吧。include d...

一本通學習筆記 最短路徑

最短路徑常用演算法有dijkstra和spfa。spfa支援負數權重,但容易被毒瘤資料卡。想讓spfa跑快點可以加入乙個小優化 用deque代替queue,然後在push的時候分類,如果比當前front的dis要小就push front,否則push back。最短路計數和次短路問題仿照普通dp處理...

一本通 Trie字典樹

phone list includeusing namespace std const int n 1e5 5 int t,n,tot,c n 10 char s 10 bool ans,bo n void clear bool insert bo u 1 return flag int main ...