hdu 3724(trie)

开始学trie,在结构体里车初始化的时候写成了tire,找了好长时间bug,难受,特别注意这里sz代表的是第几个节点,而不是层数,不同的节点可以在同一层

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=300000+10;
double hh[maxn];
int ans[maxn];
const int inf=0x3f3f3f3f;
struct Trie
{
    int sz;
    int ch[maxn][50],val[maxn];
    int idx(char cc) {return (cc-'a');}
    Trie()
    {
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
    }
   void inset(string s,int v)
   {
       int u=0;
       for(int i=0;i<s.length();i++)
       {
           int c=idx(s[i]);
           if(!ch[u][c])//u代表的是第几个点,而不是第几层,同一层可能有编号各样的点,如2,4,6
           {
               memset(ch[sz],0,sizeof(ch[sz]));//新点的下一个点清空
               val[sz]=0;
               ch[u][c]=sz++;//指向下一个点
           }
           u=ch[u][c];
           ans[u]++;//能够走到这个点就++
       }
       val[u]=v;
   }
   int serch(string aa)
   {
      int u=0;
      for(int i=0;i<aa.length();i++)
      {
          int c=idx(aa[i]);
          if(!ch[u][c])
            return 0;
          else u=ch[u][c];
      }
      return ans[u];//有几个能走到u点的
   }
};
Trie tree;
int n,m;
int main()
{
      while(~scanf("%d%d",&n,&m)&&n&&m)
      {    int qq=0;
          memset(ans,0,sizeof(ans));
          for(int i=0;i<n;i++)
          {
              string a;
              cin >> a;
              tree.inset(a,0);
          }
          int tt;
        for(int j=0;j<m;j++)
        {  string ss="";
            scanf("%d",&tt);
           for(int k=0;k<tt;k++)
           {
                double maxi=0,mini=inf*1.0;
                for(int i=0;i<8;i++)
                {
                    scanf("%lf",&hh[i]);
                    maxi=max(hh[i],maxi);
                    mini=min(hh[i],mini);
                }
            double mid=(maxi+mini)/2.0;
            for(int i=0;i<8;i++)
            {
                if(hh[i]>mid)
                    hh[i]=1;
                else hh[i]=0;
            }
            int zz=0,pp=1;
            for(int i=7;i>=0;i--)
            {
                zz+=hh[i]*pp;
                pp=pp*2;
            }
            char mmp=(char)zz;
            ss+=mmp;
           }
           qq+=tree.serch(ss);
        }
         printf("%d\n",qq);
      }
    return 0;
}

 

posted on 2017-07-31 11:42  发牌员  阅读(181)  评论(0编辑  收藏  举报

导航