1 条题解

  • -2
    @ 2023-4-10 15:41:22

    典型的字符串匹配相关题目,考虑使用字典树解决,首先将所有的学生姓名都添加进字典树,然后在结束位置打上标记,查询时,若当前查询串指向的位置p=0,则说明不存在该学生姓名,直接return -1;查询串遍历完成后,首先看p位置是否存在标记,若不存在也return -1;否则根据vis数组看是否是第一次点名,并更新vis数组。

    
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N = 500005;
    int n, m, k, s, t, tot = 1;
    int trie[N][26], ed[N], vis[N], len, ans; // vis 有没有点过名
    char str[N];
    void insert(char *str)
    {
        int len = strlen(str), p = 1;
        for (int k = 0; k < len; k++)
        {
            int ch = str[k] - '0';
            if (trie[p][ch] == 0)
                trie[p][ch] = ++tot;
            p = trie[p][ch];
        }
        ed[p]++; // 结束标记
    }
    int query(char *str)
    {
        int len = strlen(str), p = 1;
        for (int k = 0; k < len; ++k)
        {
            p = trie[p][str[k] - '0'];
            if (p == 0)
                return -1; // 非法
        }
        if (ed[p]) // 存在结束标记
        { 
            return (vis[p] == 0 ? vis[p] = 1, 0 : 1);// 是否点过名
        }
        else
            return -1;//不存在返回非法
    }
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; ++i)
        {
            cin >> str;
            insert(str);
        }
        cin >> m;
        for (int i = 1; i <= m; ++i)
        {
            cin >> str;
            k = query(str);
            if (k == -1)
                puts("WRONG");
            else if (k == 0)
                puts("OK");
            else
                puts("REPEAT");
        }
    }
    
    • @ 2023-4-12 20:14:11

      请容许我问您一句,为什么样例2到样例10无输出?为什么样例1给的数据也不对?(输入m时,本人亲身实验过,只有1933个输入!) 附:图1(测试数据) image 图2(样例1测试输出) image

    • @ 2024-1-16 10:32:15

      6

  • 1

信息

ID
2044
时间
1000ms
内存
256MiB
难度
1
标签
递交数
42
已通过
32
上传者