SDUT-1500-(字典树)

来源:互联网 发布:淘宝上兰可欣那么便宜 编辑:程序博客网 时间:2024/06/06 01:59

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

#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;}