假的字串 trie樹 拓撲

2022-03-05 15:39:39 字數 1615 閱讀 4194

題目大意:

給定n個字串,互不相等,你可以任意指定字元之間的大小關係(即重定義字典序),求有多少個串可能成為字典序最小的串,並輸出它們

具體思路:

在可以任意定義字元之間的大小關係的前提下,對於當前的字串,首先滿足他的字首中不存在已經輸入的字串;其次,對於abcd和adcb這種情況,是非法的,如果我們假設b>d,

那麼後面就會出現矛盾,這個時候我們可以通過建圖判斷有沒有環來判斷這種非法情況。

ac**:

1

#pragma comment(linker,"/stack:1024000000,1024000000")

2 #include3

using

namespace

std;

4 # define ll long

long

5 # define inf 0x3f3f3f3f

6 # define lson l,mid,rt<<1

7 # define rson mid+1,r,rt<<1|1

8const

int maxn = 3e5+5;9

const

int n = 3e4+10;10

int ch[maxn][30

];11

intval[maxn];

12int tot=0;13

void add_trie(string

str)

21 val[p]++;22}

23 vectoredge[30

];24

intin[30],vis[30

];25

void

init()27}

28bool

tuopu()

33while(!q.empty())43}

44}45for(int i=0;i<30;i++)

48return

true;49

50}51bool judge(string

str)

60 p=ch[p][u];

61if(val[p]&&i!=len-1)return

false

;// 判斷當前的字串的字首中有沒有已經出現過的字串62}

63if(val[p]>=2)return

false

;// 判斷有沒有重複的字串出現,如果有的話就不滿足為字典序最小的字串了,(好像不判斷也能a)

64return

tuopu();65}

66string

str[n];

6768 vectorans;

69int

main()

76for(int i=1;i<=t;i++)80}

81int len=ans.size();

82 cout83for(int i=0;i)

86return0;

87 }

字串 Trie樹(字典樹)

關於這個字串的資料結構我就不多說什麼了,不知道的可以戳這裡.trie樹在oi中應用廣泛,時間優秀,缺點就是空間占用大。下文中我們將字符集大小稱為 k,模式串長度為p trie支援o np 建樹,o p 插入,查詢,刪除。可是如果二維陣列儲存的話,就要耗費kn 的空間,基本無法承受。空間上我們可以用指...

字串 Trie字典樹

目錄 trie字典樹 例題 1.什麼是字典樹?2.字典樹的作用及性質 3.建樹 code 效果圖 4.查詢 code 5.優勢 6.回到例題 code 7.結束語 8.練習 給出n個字串,以及m個詢問。每次詢問讀入乙個字串,求該字串是多少個字串的字首 每個字串長度小於10 2,n和m小於10 5。樣...

字串統計 Trie樹

題目 維護乙個字串集合,支援兩種操作 i x 向集合中插入乙個字串x q x 詢問乙個字串在集合 現了多少次。共有n個操作,輸入的字串總長度不超過 10 5,字串僅包含小寫英文本母。輸入格式 第一行包含整數n,表示運算元。接下來n行,每行包含乙個操作指令,指令為 i x 或 q x 中的一種。輸出格...