洛谷1258 Tire字典树

直接上代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x) 
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+10;
int n,m,t;
int l=0;
char s[maxn];
int trie[maxn][26],cnt[maxn];
void insert(char* s)
{
    int len=strlen(s);
    int now=0;
    f(i,0,len-1)
    {
        char c=s[i]-'a';
        if(!trie[now][c])trie[now][c]=++l;
        now=trie[now][c];
    }
    cnt[now]=1;
}
int query(char* s)
{
    int len=strlen(s);
    int now=0;
    f(i,0,len-1)
    {
        char c=s[i]-'a';
        if(!trie[now][c])return 1;//匹配失败 
        now=trie[now][c];
    }
    if(cnt[now]==0)return 1;//没有单词 
    if(cnt[now]==1)
    {
        cnt[now]=2;
        return 2;
    }
    if(cnt[now]==2)return 3;
}
void debug()
{
    f(i,0,l)
    {
        pf("%d : %d next[",i,cnt[i]);
        f(j,0,26)
        {
            pf("%d ",trie[i][j]);
        }
        pf("]\n");
    }
}
int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    std::ios::sync_with_stdio(false);
    scan(n);
    mem(trie,0);
    f(i,1,n)
    {
        scanf("%s",s);
        insert(s);
//        debug();
    }
    scan(m);
    int ans=0;

    while(m--)
    {
        scanf("%s",s);
        ans=query(s);
        if(ans==1)pf("WRONG\n");
        else if(ans==3)pf("REPEAT\n");
        else pf("OK\n");
    }
 } 

猜你喜欢

转载自www.cnblogs.com/randy-lo/p/12549630.html