hoj Secret Message 解题报告

来源:互联网 发布:数据侠客行 下载 编辑:程序博客网 时间:2024/05/20 02:52
Secret Message

      这是一道trie树题目,题意是给了个字典,然后再给你单词,看与字典里多少词匹配。这里的匹配意思是:较短的那个词是较长那个词的前缀。这里有个trick就是,同样的单词可能出现多次。(我在这里wa了几回)

#include <iostream>#define N 224288using namespace std;struct data{    int r,l,f,tot;}tree[N];int ans,first;int main(){    int n,m,i,flag,*root,j,k,a;    while (scanf("%d %d",&n,&m)==2)    {        first=2;        memset(tree,0,sizeof(tree));        for (i=0;i<n ;i++)        {            scanf("%d",&k);            flag=0;            root=&flag;            *root=1;            for (j=0;j<k;j++)            {                scanf("%d",&a);                if (a) root=&tree[*root].r;                else root=&tree[*root].l;                if(!*root)*root=first++;            }            tree[*root].f++;        }        for (i=first-1;i>1;i--)        {            tree[i].tot=tree[tree[i].r].tot+tree[tree[i].l].tot+tree[i].f;        }        for (i=0;i<m ;i++)        {            scanf("%d",&k);            ans=0;            root=&flag;            *root=1;            for (j=0;j<k;j++)            {                scanf("%d",&a);                if(a)root=&tree[*root].r;                else root=&tree[*root].l;                ans+=tree[*root].f;                if(!*root)                    for(;j<k-1;j++)                        scanf("%d",&a);            }            ans+=tree[*root].tot-tree[*root].f;            printf("%d\n",ans);        }    }    return 0;}


原创粉丝点击