开始学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; }