20 ad ae af ag ah ai aj ak al ads add ade adf adg adh adi adj adk adl aes 5 b a d ad s
0 20 11 11 2
/* http://acm.hdu.edu.cn/showproblem.php?pid=2846 Repository 字典樹變式 */ #include#include #include #include #include using namespace std; typedef struct node{ int no; int count; struct node* next[27]; node(int _count = 0) { count = _count; no = -1; int i; for(i = 0 ; i < 27 ; i ++) { next[i] = NULL; } } }Trie; void insertNode(Trie* trie , char* s,int noo) { Trie* t = trie; int i = 0; while(s[i] != '') { int tmp = s[i]-'a'; if(t->next[tmp] == NULL) { t->next[tmp] = new node(0); } t = t->next[tmp]; if(t->no != noo) // noo 做標記 增加數量 { t->count ++; t->no = noo; } i ++; } } int func(Trie* trie,char s[]) { Trie* t = trie; Trie* tpre; int i = 0; while(s[i] != '') { int tmp = s[i]-'a'; if(t->next[tmp] == NULL) { return 0; } tpre = t; t = t->next[tmp]; i ++; } return t->count; } int main() { //freopen(in.txt,r,stdin); int n , m ; int i , j ; scanf(%d,&n); char stmp[21]; Trie* trie = new node(0); for(i = 0 ; i < n ; i ++) { scanf(%s,stmp); int len = strlen(stmp); /* 這裡對於stmp = abc 分為 abc,bc,c這3個字符串插入 一次插入後如下圖 root / | a b c / | b c / c 每次都這樣處理, 相應字符的count 會加上去,最後統計count就行了 */ for(j = 0;j < len ;j ++) { insertNode(trie , stmp+j , i); } } scanf(%d , &m) ; for(i = 0 ; i < m ; i ++) { scanf(%s,stmp); printf(%d , func(trie,stmp) ) ; } return 0; }