hdu 1247 字典树模版

来源:互联网 发布:linux下运行jar包 编辑:程序博客网 时间:2024/05/29 12:45

对于每个字符串,判断是否为hatword,可以先找此字符串不同的划分前缀,然后对每个前缀对应的后缀进行检查,是否满足题目条件。

#include<cstdio>#include<cstring>const int maxn=100000;int node[maxn][26];bool finish[maxn];int pos=0;void add(char *str){    int rt=0;    for(int i=0;str[i];i++)    {        int x=str[i]-'a';        if(node[rt][x]==0)            node[rt][x]=(++pos);        rt=node[rt][x];    }    finish[rt]=1;}bool check(char *str){    int len=strlen(str);    int stack[1000],top=-1;    int rt=0;    for(int i=0;str[i];i++)    {        int x=str[i]-'a';        if(node[rt][x]==0) return false;        rt=node[rt][x];        if(finish[rt]==1) {stack[++top]=i+1;}    }    while(top>=0)    {        rt=0;        for(int i=stack[top--];str[i];i++)        {            int x=str[i]-'a';            if(node[rt][x]==0) break;            rt=node[rt][x];            if(finish[rt]==1&&i==len-1) return true;        }    }    return false;}char temp[50000][100];int main(){    memset(finish,0,sizeof(finish));    memset(node,0,sizeof(node));    int k=0;    while(gets(temp[k]))    {        add(temp[k]);        k++;    }    for(int i=0;i<k;i++)    {        if(check(temp[i]))            printf("%s\n",temp[i]);    }    return 0;}



0 0