Trie树

来源:互联网 发布:知花作品全集 编辑:程序博客网 时间:2024/06/11 01:07

Trie树关于前缀计算的应用:

HDUOJ   1251统计难题   http://acm.hdu.edu.cn/showproblem.php?pid=1251

HDUOJ   1671PhoneList   http://acm.hdu.edu.cn/showproblem.php?pid=1671


统计难题 

题意就是给出几个word  再给几个word问有几个是已这几个word作为前缀的word

直接模版就可以了

PhoneList

题意就是问给的一系列数字组合中有木有数字组合是其他数字组合的前缀  

要把所有输入的数字组合都保存insert  然后find  看find的值是否大于1

敲了板子之后提交报错  内存超了   看了别人的代码  发现就是要释放内存  加个release函数 

贴个代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;char a[10005][10];struct node{    int cnt;    node *next[10];    node()    {        for(int i=0;i<10;i++)  next[i]=NULL;    }};node *root;void insert(char *str){    node *p,*newnode;    p=root;    for(;*str;str++)    {        if(p->next[*str-'0']!=NULL)        {            p=p->next[*str-'0'];            p->cnt++;        }        else        {            newnode=new node;            p->next[*str-'0']=newnode;            p=p->next[*str-'0'];            p->cnt=1;        }    }}int find(char *str){    node *p;    p=root;    for(;*str;str++)    {        if(p->next[*str-'0']!=NULL)  p=p->next[*str-'0'];        else return 0;    }    return p->cnt;}void release(struct node *now)//释放内存{    for(int i=0;i<10;i++)        if(now->next[i])            release(now->next[i]);    delete now;}int main(){    int tc;    scanf("%d",&tc);    while(tc--)    {        root=new node;        root->cnt=0;        int n;        scanf("%d",&n);        getchar();        for(int i=0;i<n;i++)        {            scanf("%s",a[i]);            insert(a[i]);        }        int flag=0;        for(int i=0;i<n;i++)        {            if(find(a[i])>1)            {                flag=1;                break;            }            else                continue;        }       // cout<<flag<<endl;        if(flag)            puts("NO");        else            puts("YES");        release(root);    }    return 0;}



语言翻译应用

HD 1075   

题意就是将火星文翻译成英文输出

http://acm.hdu.edu.cn/showproblem.php?pid=1075


insert()将模版中的cnt换成翻译后的字符串  绑在要被翻译的字符串最后一个字符上

find()依次判断每个字符是不是跟初始状态一样  加上对最后一个字符的判断

一开始用 char *s;  简直蛋疼  指针真的好难搞

string 有时还是蛮好用的  有些函数还是值得用的

贴个代码:

#include <iostream>#include <string>#include <cstring>#include <cstdio>using namespace std;struct node{    string s;    node *next[26];    node()    {        s="";        memset(next,0,sizeof(next));    }};node *root;void insert(string s1,string s2){    node *p;    p=root;    for(int i=0;i<s2.size();i++)    {        if(p->next[s2[i]-'a']==NULL)            p->next[s2[i]-'a']=new node();        p=p->next[s2[i]-'a'];    }    p->s=s1;}void find(string s){    //cout<<" "<<s<<" ";    node *p;    p=root;    for(int i=0;i<s.size();i++)    {        int num=s[i]-'a';        if(p->next[num]==NULL)        {            cout<<s;            return;        }        p=p->next[num];    }    if(p->s=="")  cout<<s;    else  cout<<p->s;}int main(){    string s,s1,s2;    root=new node();    cin>>s;//start    while(cin>>s1&&s1!="END")    {        cin>>s2;        //cout<<s1<<"  "<<s2<<endl;        insert(s1,s2);    }    cin>>s;//start    getchar();//\n    while(getline(cin,s)&&s!="END")    {        int n=0;        for(int i=0;i<s.size();i++)        {            if(s[i]<'a'||s[i]>'z')            {                s2=s.substr(n,i-n);//截取字符串  j~i-1               // cout<<endl<<s1<<endl;                find(s2);                cout<<s[i];                n=i+1;            }        }        cout<<endl;    }    return 0;}


//待续  欢迎大家评论 给点建议


0 0
原创粉丝点击