hdu1251 动态链表实现:
#include<stdio.h> #include<string.h> using namespace std; typedef struct Node { int prefix; Node* next[27]; Node(){ prefix=0; memset(next,0,sizeof(next)); } }Node; Node rt; char c='a'; Node tree[100010]; void insert(char* s) { int i; Node* tt; tt=&rt; for(i=0;*s;++s) { if(!tt->next[*s-c]) { tt=tt->next[*s-c]=new(Node); tt->prefix++; } else { tt=tt->next[*s-c]; tt->prefix++; } } } int query(char* s) { int i; Node* tt=&rt;; for(i=0;*s;++s) { if( !tt->next[*s-c]) return 0; else tt=tt->next[*s-c]; } return tt->prefix; } int main() { int i,j; char str[20]; memset(rt.next,0,sizeof(rt.next)); rt.prefix=0; while(gets(str),strlen(str)>0) insert(str); while(scanf("%s",str)!=EOF) printf("%d\n",query(str)); return 0; }
#include<stdio.h> #include<string.h> int g[1000000][26]={0}; char c='a'; int tot=1; int rank[1000000]={0}; void initial() { memset(g[1],0,sizeof(g[1])); tot=1; } void insert(char* s) { int i,j; for(i=1;*s;++s) { if( !g[i][*s-c] ) { i=g[i][*s-c]=++tot; rank[i]++; //计数时要格外注意。 memset(g[tot],0,sizeof(g[tot])); } else i=g[i][*s-c],rank[i]++; } } int query(char* s) { int i,j; for(j=1;*s;++s) { if( !g[j][*s-c]) return 0; j=g[j][*s-c]; } return rank[j]; } int main() { int i,j,k; char str[20]; initial(); while(gets(str),strlen(str)>0) insert(str); while(scanf("%s",str)!=EOF) printf("%d\n",query(str)); return 0; }