Description
給定\(n\)個長度不超過\(10\)的數字串,判斷是否有兩個字符串\(A\)和\(B\),知足\(A\)是\(B\)的前綴,如有,輸出
NO
,若沒有,輸出YES
。數組
一道\(Trie\)樹裸題,我交了20次.spa
嗚嗚嗚嗚,難受.code
剛開始是看錯題,有的話輸出"NO",沒有輸出「YES」什麼鬼題啊!!!ip
一眼看到就會切了的.害得我交了20次啊!字符串
\(ok[v]\)表示以\(v\)爲結尾的字符串是否出現過.string
\(cnt[u]\)表明當前節點被遍歷過幾回,判斷插入的某字符串的末尾是否被經歷過兩次以上.io
輸出便可.class
記得\(memset\).遍歷
代碼
di
#include<cstdio> #include<cstring> #define clear(a) memset(a,0,sizeof a) #define R register using namespace std; int tri[100005][12],n,T,rt,tot,cnt[100005]; char s[15]; bool flg,ok[100005]; inline void insert(int u,char *s) { int len=strlen(s); for(R int i=0;i<len;i++) { int v=s[i]-'0'; if(!tri[u][v]) tri[u][v]=++tot; u=tri[u][v]; cnt[u]++; if(ok[u])flg=true; } ok[u]=true; if(cnt[u]>1)flg=true; } int main() { scanf("%d",&T); while(T--) { flg=false; clear(tri);clear(ok); clear(cnt);tot=0; scanf("%d",&n); for(R int i=1;i<=n;i++) { scanf("%s",s); insert(rt,s); } puts(flg?"NO":"YES"); } }