这道题我是按照大白书(算法竞赛入门指南)的思想来的,经典的Trie树,不会用C++ 所以那C写的
定义了一个二维数组来存储node节点 然后又用了一个num[MAX]来存储各个前缀的数量
一开始定义的MAX为10000; 果然RE了 他说只有一组测试 我以为随便写一个就好了 果然上当了
以为算法写错了 后来该到了1000000 过了 下面是AC代码 看到别的小伙伴各种数据结构(好羡慕)
# include <stdio.h>
# include <string.h>
const int MAX = 1000000;
int node[MAX][30];
int val[MAX];
int num[MAX];
int mz=0;
void init(){
mz=0;
memset(node,0,sizeof(node));
memset(val,0,sizeof(val));
memset(num,0,sizeof(num));
}
void insert_trie(char * p,int len){
int u=0;
for(int i=0;i<len;i++){
int c = p[i]-'a';
if(node[u][c]==0){
mz++;
node[u][c]=mz;
}
u=node[u][c];
num[u]++;
}
}
int query_trie(char *p ,int len){
int u=0;
for(int i=0;i<len;i++){
int c = p[i]-'a';
if(node[u][c]==0){
return 0;
}
u = node[u][c];
}
return num[u];
}
int main(){
char s[20];
int mark=0;
while(gets(s)!=NULL){
if(s[0]=='\0'){
mark=1;
continue;
}
int ans=0;
int len = strlen(s);
if(mark==1){
ans = query_trie(s,len);
printf("%d\n",ans);
}else if(mark==0){
insert_trie(s,len);
}
}
return 0;
}