hoj Secret Message 解题报告

Secret Message

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

#include <iostream>
#define N 224288
using 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;
}


你可能感兴趣的:(hoj Secret Message 解题报告)