描述
小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。
-
输入
- 第一行包含一个整数T(T<=100).表示测试数据组数。 接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。 接下来n行,每行包含一个字符串,长度不大于15。 接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。 输出
- 输出每组小明询问数串出现的次数。
-
#include<iostream> using namespace std; class node { public: char d; int flag; int num; node *l,*r; node() { num=0; flag=0; l=r=NULL; } }; void create(node *&root,char str[]); int search(node *root,char str[]); int main() { int T,n,m; char str[18]; cin>>T; node *root=new node; while(T--) { root->l=root->r=NULL; cin>>n>>m; while(n--) { cin>>str; create(root,str); } while(m--) { cin>>str; cout<<search(root,str)<<endl; } } } void create(node *&root,char str[]) { node *p=root; char *q=str; while(*q) { if(p->l==NULL) { p->l=new node; p=p->l; p->d=*q; } else { p=p->l; while(p->r&&p->d!=*q) p=p->r; if(p->d!=*q) { p->r=new node; p=p->r; p->d=*q; } } ++q; } p->flag=1; p->num++; } int search(node *root,char str[]) { node *p=root; char *q=str; while(*q) { if(p->l==NULL) return 0; else { p=p->l; while(p->r&&p->d!=*q) p=p->r; if(p->d!=*q) return 0; } ++q; } return p->num; }