LuoguP2580字典树

link

链接

code

tag[num] == 1表示从根节点到编号为num的节点所表示的字符串曾经出现过。为了判断是否重复,可以对已经重复的tag值修改为2.

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 500010;
int m, n, tr[N][26], tag[N];
int cnt = 1;

int main(){
#ifdef DEBUG
    freopen("in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin >> n;
    string s;
    for (int i = 0; i < n; ++i) {
        cin >> s;
        int u = 1;
        for (int j = 0; j < s.length(); ++j) {
            int num = s[j] - 'a';
            if (!tr[u][num]) tr[u][num] = ++cnt;
            u = tr[u][num];
        }
        tag[u] = 1;
    }

    cin >> m;
    for (int i = 0; i < m; ++i) {
        cin >> s;
        int u = 1;
        for (int j = 0; j < s.length(); ++j) {
            int num = s[j] - 'a';
            u = tr[u][num];
            if (u == 0) break;
        }
        if (tag[u] == 1) {
            tag[u] = 2;
            cout << "OK" << endl;
        } else if (tag[u] == 2)
            cout << "REPEAT" << endl;
        else
            cout << "WRONG" << endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值