3 条题解
- 
  0
备注: ******************************************/ #include <queue> #include <math.h> #include <stack> #include <stdio.h> #include <iostream> #include <vector> #include <iomanip> #include <string.h> #include <algorithm> #include <map> using namespace std; #define LL long long const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; struct node { int a[27], end; node() { memset(a, 0, sizeof a); end = 0; } }tr[N]; int id = 0; //id表示新儿子的下标 void add(string s) { int head = 0, len = s.size(); //head表示当前节点的儿子 for(int i = 0; i < len; i++) { int k = s[i] - 96; if(!tr[head].a[k]) tr[head].a[k] = ++id; //有儿子就处理,没儿子就加一个 head = tr[head].a[k]; } tr[head].end++; } int find(string s) { int head = 0, len = s.size(), ans = 0; for(int i = 0; i < len; i++) { int k = s[i] - 96; head = tr[head].a[k]; //往下一个儿子走 if(!head) return ans; ans += tr[head].end; //tr[head].end表示以这个单词结尾的单词数量 } return ans; //没有儿子就返回ans } signed main() { //freopen(".in", "r", stdin); //freopen(".out", "w", stdout); int n, m; cin>>n>>m; for(int i = 1; i <= n; i++) { string s; cin>>s; add(s); } for(int i = 1; i <= m; i++) { string s; cin>>s; cout<<find(s)<<endl; } return 0; } 
信息
- ID
 - 53
 - 时间
 - 1000ms
 - 内存
 - 128MiB
 - 难度
 - 3
 - 标签
 - 递交数
 - 126
 - 已通过
 - 67
 - 上传者