字典树
将每个字符串的所有前缀插入进树,采用ID防止重复即可
#include<iostream> #include<cstring> #include<string> using namespace std; string str; int n; int id; struct stu { int m; int id; stu* a[26]; stu() { m=id=0; //memset(a,NULL,sizeof(a)); for(int i=0;i<26;i++) a[i]=NULL; } }; stu* p=new stu(); void build(stu *root,int cnt) { int x=str[cnt]-'a'; if(root->a[x]==NULL) { root->a[x]=new stu(); } root=root->a[x]; if(root->id!=id) { root->id=id; root->m++; } if(cnt==str.size()-1) return; else build(root,cnt+1); } int find(stu* root,int cnt) { int x=str[cnt]-'a'; root=root->a[x]; if(root==NULL) return 0; if(cnt==str.size()-1) return root->m; else return find(root,cnt+1); } int main() { cin.sync_with_stdio(false); cin>>n; while(n--) { id=n; cin>>str; for(int i=0;i<=str.size()-1;i++) { build(p,i); } } int m; cin>>m; while(m--) { cin>>str; cout<<find(p,0)<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-13 03:40:02