HDU 1247 字典树

来源:互联网 发布:linux 提升用户权限 编辑:程序博客网 时间:2024/05/18 06:38

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1247

字典树入门经典例题. 字典树题目的特点是字符串处理上有重叠现象,例如在一个字串中找字串,本题目是在一个字符串中查找是否可能由两个字符串拼接而成。

核心内容

class node{public:    node* next[26];    bool value;    node() : value(false)    {        memset(next,0,sizeof(next));    }};


AC代码: View Source On GitHub

#include <iostream>#include <cstring>using namespace std;class node{public:    node* next[26];    bool value;    node() : value(false)    {        memset(next,0,sizeof(next));    }};node _headnode;node* head=&_headnode;void insert(const char* str){    int L=strlen(str);    node* p=head;    for(int i=0;i<L;i++)    {        if(p->next[str[i]-'a']==nullptr)        {            p->next[str[i]-'a']=new node;        }        p=p->next[str[i]-'a'];    }    p->value=true;}bool search(const char* str){    int L=strlen(str);    node* p=head;    for(int i=0;i<L;i++)    {        if(p->next[str[i]-'a']!=nullptr)        {            p=p->next[str[i]-'a'];            if(p->value)            {                bool isFound=true;                node* q=head;                for(int j=i+1;j<L;j++)                {                    if(q->next[str[j]-'a']!=nullptr)                    {                        q=q->next[str[j]-'a'];                    }                    else                    {                        isFound=false;                        break;                    }                }                if(isFound)                {                    if(q->value)                    {                        return true;                    }                }            }        }        else        {            break;        }    }    return false;}#define MAXN 50005#define MAXLEN 1005char input[MAXN][MAXLEN];int main(){    int i=0;    while(cin>>input[i])    {        insert(input[i++]);    }    for(int ci=0;ci<i;ci++)    {        if(search(input[ci]))        {            cout<<input[ci]<<endl;        }    }    return 0;}


0 0
原创粉丝点击