3 条题解

  • 0
    @ 2022-11-10 20:02:32
    备注:
    ******************************************/
    #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
    标签
    递交数
    116
    已通过
    60
    上传者