trie樹(板子)
阿新 • • 發佈:2018-10-31
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; #define fuck(x) cout<<#x<<" "<<x<<endl; struct node { int cnt,tag; node*son[26]; }*root; char s[105]; node*build() { node*tmp=new(node); tmp->cnt=0; tmp->tag=0; memset(tmp->son,0,sizeof(tmp->son)); return tmp; } void myinsert() { int len=strlen(s); char*p=s; node*r=root; while(*p) { int id=*p-'a'; if(!(r->son[id])) r->son[id]=build(); r=r->son[id]; if((s+len-1)!=p) (r->cnt)++; p++; } r->tag++; } int query1() { char*p=s; node*r=root; while(*p) { int id=*p-'a'; if(!(r->son[id])) return 0; p++; r=r->son[id]; } return r->tag; } int query2() { char*p=s; node*r=root; while(*p) { int id=*p-'a'; if(!(r->son[id])) return 0; p++; r=r->son[id]; } return r->cnt; } int main() { int n,m; scanf("%d %d",&n,&m); root=build(); for(int i=1;i<=n;i++) scanf("%s",s),myinsert(); for(int i=1;i<=m;i++) { int ans; scanf("%s",s); ans=query1(); cout<<"字串:"<<s<<"出現了"<<ans<<"次"<<endl; ans=query2(); cout<<"字串:"<<s<<"作為前綴出現了"<<ans<<"次"<<endl; } return 0; }