POJ 1816 Wild Words

来源:互联网 发布:matlab算矩阵乘法 编辑:程序博客网 时间:2024/05/17 23:30

对所有模式串建trie树,
对每一个字符串在trie树上进行DFS统计答案,
注意’*’可以包含任意多的字符,也不包含任何字符!

trie树好久没写,写不熟了。写的时候借鉴了一下各路神犇的代码^_^

#include<cstdio>#include<vector>#include<cstring>#define MAXN 100010#define MAXM 110using namespace std;int ans[MAXN], n, m;char s[25];struct node{    node *next[30];    vector<int> val;    node(){memset(next,0,sizeof(next));}};struct TRIE{    int len;    node *root;    void pre(){root = new node();}    int idx(char ch)    {        if(ch=='?')return 'z'-'a'+1;        if(ch=='*')return 'z'-'a'+2;        else return ch-'a';    }    void insert(char *s, int id)    {        len=strlen(s);        node *p=root;        for(int i = 0; i < len; i++)        {            int c = idx(s[i]);            if(!p->next[c])                p->next[c]=new node();            p=p->next[c];        }        p->val.push_back(id);    }    void dfs(char *s, node *p, int pos)    {        if(s[pos]==0)        {            for(int i = 0; i < p->val.size(); i++)            {                ans[p->val[i]]=1;            }            if(p->next[idx('*')])                dfs(s,p->next[idx('*')],pos);        }        else        {            int c=idx(s[pos]);            if(p->next[c])dfs(s,p->next[c],pos+1);            if(p->next[idx('?')])dfs(s,p->next[idx('?')],pos+1);            if(p->next[idx('*')])                for(int i = pos; i <= len; i++)                    dfs(s,p->next[idx('*')],i);        }    }    void find(char *s)    {        len=strlen(s);        memset(ans,0,sizeof(ans));        dfs(s,root,0);        bool mat=0;        for(int i = 1; i <= n; i++)        {            if(ans[i])            {                mat=1;                printf("%d ",i-1);            }        }        if(!mat)            printf("Not match");        printf("\n");    }}trie;int main(){    scanf("%d%d",&n,&m);    trie.pre();    for(int i = 1; i <= n; i++)    {        scanf("%s",s);        trie.insert(s,i);    }    for(int i = 1; i <= m; i++)    {        scanf("%s",s);        trie.find(s);    }    return 0;} 
1 0