当前位置: 代码迷 >> 综合 >> SDUT-1500-(字典树)
  详细解决方案

SDUT-1500-(字典树)

热度:63   发布时间:2023-12-19 11:36:00.0

字典树,注意到最后用完字典树的时候把字典树删除,要不容易产生空间不足。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct list
{int leap;struct list *num[26];
};
int number;
char str[10];
struct list *code()
{int  i;struct list *p;p=new list();p->leap=0;for(i=0;i<26;i++){p->num[i]=NULL;}return p;
}
void in(struct list *q,char *s)
{struct list *p;p=q;int n,t,i;n=strlen(s);for(i=0;i<n;i++){t=s[i]-'a';if(p->num[t]==NULL)p->num[t]=code();p=p->num[t];}p->leap=1;
}
void search(struct list *q,char *s)
{struct list *p;p=q;int n,i,t;n=strlen(s);for(i=0;i<n;i++){t=s[i]-'a';if(p->num[t]==NULL)break;p=p->num[t];}if(p->leap==1)number--;p->leap=0;
}
void strr(char *s)
{int n,i;n=strlen(s);for(i=0;i<n;i++){if(s[i]>='A'&&s[i]<='Z')s[i]=s[i]+'a'-'A';}
}
void del(struct list *p)
{int i;if(p){for(i=0;i<26;i++){if(p->num[i])del(p->num[i]);}}free(p);p=NULL;
}
int main()
{int m,n,i;while(cin>>n,n){number=n;cin>>m;getchar();struct list *tree;tree=code();for(i=0;i<n;i++){gets(str);strr(str);in(tree,str);}for(i=0;i<m;i++){gets(str);strr(str);search(tree,str);}printf("%d\n",number);del(tree);}return 0;
}