給定 n個長度不超過10的數字串,問其中是否存在兩個數字串 s、t,使得 s是 t的字首,多組資料。
輸入格式
第一行乙個整數 t,表示資料組數。
對於每組資料,第一行乙個數n,接下來 n行輸入 n個數字串。
輸出格式
對於每組資料,若存在兩個數字串 s、t,使得 s是 t的字首,則輸出 no ,否則輸出 yes 。
請注意此處結果與輸出的對應關係!
樣例樣例輸入23
91197625999
91125426
5113
12340
123440
12345
98346
樣例輸出
noyes
資料範圍與提示
對於 100%的資料、1≤t≤40,1≤n≤10^4。
思路:本題每組給出多組數字串,判斷某數字串是否為其他數字串的字首,用字典樹判斷,將字串寫入字典樹中,判斷字串是否在某乙個樹枝上或者是否能將某個樹枝走完,
若能將樹枝走完或者字串全部都在某個樹枝上,則說明有字首,若能將樹枝走完則說明樹枝上的字串為正在走的字串的字首,字串全部都在某個樹枝上說明正在走樹枝的字串為樹枝的字首。
**:
#include
#include
#include
#include
using
namespace std;
const
int m=
1e5+10;
int l;
///字串長度
int book[m]
;///標記尾部節點
char a[m]
;///需要儲存在樹中的字串
int ch[m][20
];///記錄每個節點編號以及此節點的元素的下乙個節點編號
///同時標記此節點編號及元素
int tot;
///記錄總節點個數
intinsert()
///(1)如果在ch[u][c]!=0時走到字元終點
///說明此字串為正走的這個枝節的字首
else
if(i==l-1)
u=ch[u]
[c];
///移到下乙個節點
///當ch[u][c]!=0時,沿此節點重合下移,
///(2)如果字串走到枝節的末尾
///說明正走的這個枝節是此字串的字首
if(book[u])}
book[u]=1
;///對末節點進行標記
return flag;
}int
main()
}if(flag)
cout<<
"no"
cout<<
"yes"
<}return0;
}
字典樹 例題
關於學習字典樹,可以轉步這篇文章傳送門 例題1 poj3630 hdu 1671 這裡要在插入時候進行檢驗是否存在某個號碼是已存在號碼的字首或者存在某個號碼是當前插入號碼 的字首。先說hdu1671,因為poj的使用動態建樹給tle了,所以要用靜態建樹,這裡先說動態建樹 hdu1671 感覺可以做模...
Trie字典樹例題
前幾天做了個trie樹的題,正好記一下。首先先看乙個簡單題 acwing 143.最大異或對 題目 在給定的n個整數a1,a2 an中選出兩個進行 xor 異或 運算,得到的結果最大是多少?第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出乙個整數表示答案。1 n 105 0 a i 23 1...
字典樹入門和例題
如圖所示 每個字元有很多個分支,打黃色標記的就是字串的結尾,所以這顆字典樹中有哪些字串呢,ab ay ayf c cc cd 其他的枝沒有畫全。順序儲存字串 ab ay ayf c cc cd 節點編號講究先到先得 陣列tree i j 代表i 節點的第 j個兒子的節點編號。獲取第幾個孩子可以s i...