16分求助

P8306 【模板】字典树

FengSiYuan1 @ 2024-08-04 20:22:28

#include<iostream>
#include<algorithm>
using namespace std;
string a[200000];
string b[200000];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    while(n--){
        int y,z;
        cin>>y>>z;
        for(int i=0;i<y;i++){
            cin>>a[i];  
        }
        for(int i=0;i<z;i++){
            cin>>b[i];
        }   
        for(int i=0;i<z;i++){
            int ans=0;
            for(int j=0;j<y;j++){
                for(int c=0;c<b[i].size();c++){
                    if(b[i][c]!=a[j][c]){
                        goto CONTINUE;
                    }
                }
                ans++;
                if(n=-342843)
                CONTINUE:continue;
            }
            cout<<ans<<endl;
        } 
    }
    return 0;
}

by zhouzihang1 @ 2024-08-04 20:27:49

@FengSiYuan1 暴力肯定T啊


by FengSiYuan1 @ 2024-08-04 20:54:02

@zhouzihang1
但字典树我不会啊


by zhouzihang1 @ 2024-08-04 21:57:38

@FengSiYuan1 不会你做什么


by piano_pei @ 2024-08-06 19:00:35

@FengSiYuan1 字典树是按前缀储存字符串的,可以参考一下我的,记得回关

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int ch[80], cnt;
};
vector<node>trie; // 字典树,用vector节省内存 
int root, tot; 
inline void build() // 初始化 
{
    trie.clear();
    trie.push_back((node){{0}, 0});
    root = tot = 0;
}
inline void push_in(string s) // 将s插入字典树 
{
    int cur = root; // 从根节点开始 
    for(int i = 0;i < s.size();++i)
    {
        if(!trie[cur].ch[s[i]-'0']) // 没有节点就新建 
        {
            trie[cur].ch[s[i]-'0'] = ++tot;
            trie.push_back((node){{0}, 0});
        }
        trie[cur].cnt++; // 前缀数量加1 
        cur = trie[cur].ch[s[i]-'0'];
    }
    trie[cur].cnt++;
}
inline int search(string s) // 搜索前缀为s的数量 
{
    int cur = root; // 从根节点开始 
    for(int i = 0;i < s.size();++i)
    {
        // 没有节点则s在字典树里不存在,输出0 
        if(trie[cur].ch[s[i]-'0'] == 0) return 0;
        cur = trie[cur].ch[s[i]-'0'];
    }
    return trie[cur].cnt; // 返回数量 
}
int main()
{
    int t, n, q;
    string s;
    cin >> t;
    while(t--)
    {
        build();
        scanf("%d%d", &n, &q);
        while(n--)
        {
            cin >> s;
            push_in(s);
        }
        while(q--)
        {
            cin >> s;
            printf("%d\n", search(s));
        }
    }
    return 0;
}

by FengSiYuan1 @ 2024-08-06 21:46:02

@pianopei
好嘞(感谢,已壶关


|