題目大意:
給定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 中的一種。輸出格...