彩笔的发现:(1)动态trie超时。(2)要保证OJ输入的原子性,不可中途随意break掉。(3)memset过大的数组也挺耗时的。
#include <stdio.h> #include <string.h> #define BRANCH 1 #define LEAF 0 const int MAXN = 10; const int MAXLEN = 20; const int NIL = 0; typedef struct { int type; int count; int next[MAXN]; }NODE; int root; NODE trie[1000000]; int cnt; bool flag; bool INSERT(const char* s) { int curr; int newnode; int len = strlen(s); curr = root; for (int i = 0; i < len; i++) { if ( trie[curr].next[s[i] - '0'] == NIL ) { newnode = cnt++; trie[curr].next[s[i] - '0'] = newnode; trie[curr].type = BRANCH; if ( trie[curr].count > 0 ) return false; } curr = trie[curr].next[s[i] - '0']; } trie[curr].count += 1; if ( trie[curr].type == BRANCH ) return false; return true; } int main() { // freopen("3.txt","r",stdin); int T,N,i; char buffer[MAXLEN]; scanf("%d",&T); while ( T-- ) { flag = true; root = 0; cnt = 1; scanf("%d",&N); for ( i = 0; i < N; i++) { scanf("%s",buffer); if ( flag ) flag = INSERT(buffer); } if ( flag == false ) printf("NO\n"); else printf("YES\n"); memset(trie, 0, cnt * sizeof(NODE)); } return 0; }