HDU

来源:互联网 发布:购买了域名怎么使用 编辑:程序博客网 时间:2024/06/06 07:32

之前用hash做过这题后面想一下其实字典树也是一样的
只要把hash的建立过程替换成建立字典树就可以了速度上更快一点
不过空间消耗大。
hash链接->hash AC代码

字典树AC代码

#include<stdio.h>#include<string.h>struct Trie{    struct node    {        int flag;        int next[26];        void init()        {            for(int i=0;i<26;i++)            next[i]=-1;        }    };    int top;    node p[100050];    void init()    {        p[0].init();        top=1;    }    void insert(char *s)    {        int pp=0;        for(int i=0;s[i];i++)        {            if(p[pp].next[s[i]-'a']==-1)            {                p[pp].next[s[i]-'a']=top;                p[top].init();                top++;            }            pp=p[pp].next[s[i]-'a'];        }        p[pp].flag=1;    }    bool query(char *s)    {        int pp=0;        for(int i=0;s[i];i++)        {            if(p[pp].next[s[i]-'a']==-1)            return false;            pp=p[pp].next[s[i]-'a'];        }         return pp!=-1&&p[pp].flag;    }}T;char a[100010][20];int main(){    T.init();    int cnt=0;    while(scanf("%s",a[cnt])==1&&a[cnt][0]!='\0')    {        T.insert(a[cnt]);        cnt++;    }    char s1[20],s2[20];    for(int i=0;i<cnt;i++)    {        int flog=0;        for(int j=0;j<a[i][j+1]!='\0';j++)        {            s1[j]=a[i][j];            s1[j+1]='\0';            if(T.query(s1))            {                int k;                for(k=0;a[i][j+k+1]!='\0';k++)                    s2[k]=a[i][j+k+1];                    s2[k]='\0';                    if(T.query(s2))                    {                        printf("%s\n",a[i]);                        flog=1;                        break;                    }            }            if(flog)            break;        }    }}
0 0
原创粉丝点击