洛谷P2580 于是他错误的点名开始了【trie板子】

题目链接:洛谷P2580 于是他错误的点名开始了

最近在重新学字符串体系,打算从头开始好好学习;

这里先贴一个trie的板子;

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=5e5+7;
const int mod=1e9+7;
const ll INF=1e18;
char s[maxn];
struct trie
{
    int nex[maxn][30],cnt;
    int exist[maxn];
    void insert(char *s,int l) //插入字符串
    {
        int p=0;
        for(int i=0;i<l;i++)
        {
            int c=s[i]-'a'; //注意串里的字符集是什么 
            if(!nex[p][c]) nex[p][c]=++cnt;
            p=nex[p][c];
        }
        exist[p]=1;
    }
    int find(char *s,int l) //查找字符串
    {
        int p=0;
        for(int i=0;i<l;i++)
        {
            int c=s[i]-'a';
            if(!nex[p][c]) return false;
            p=nex[p][c];
        }
        int tmp=exist[p];
        if(exist[p]) exist[p]++;
        return tmp;
    }
}Trie;
void rua()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++) 
    {
        scanf("%s",s);
        Trie.insert(s,strlen(s));
    }
    int m;scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%s",s);
        int res=Trie.find(s,strlen(s));
        if(res==0) puts("WRONG");
        else if(res==1) puts("OK");
        else puts("REPEAT");
    }
    return;
}
int main()
{
    rua();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43813163/article/details/105079131