hdu 1251 统计难题 字典树
#include <stdio.h> #include <string.h> #define maxn 28 #define inf 500000 int sz; int ch[inf][maxn],val[inf],sum[inf]; int idx(char c) { return c-'a'; } void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); memset(sum, 0, sizeof(sum)); } void insert(char *s, int v) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; sum[u]++; } val[u] = v; } int find_prefixes(char *s, int len) { int u = 0; for(int i = 0; i < len; i++) { int c = idx(s[i]); if(ch[u][c]) u = ch[u][c]; else return 0; } return sum[u]; } int main() { init(); int i; char ob[15]; while(1) { gets(ob); if(!strcmp(ob,"")) break; insert(ob,1); } while(scanf("%s",ob)!=EOF) printf("%d\n",find_prefixes(ob,strlen(ob))); return 0; }