P2580 于是他错误的点名开始了(Trie)

传送门

仔细看一下题目,事实上就是字典树的模板题,对于insert操作和search操作进行一下微调就可以了。主要的调整是,附加信息不在insert操作里面插入,而是在search操作中插入

在本题中,附加信息为该字符串是不是第一次被询问。

code:

#include <cstdio>
#include <cstring>
#define ll int
#define inf 1<<30
#define mt(x,y) memset(x,y,sizeof(x))
#define il inline 
il ll max(ll x,ll y){return x>y?x:y;}
il ll min(ll x,ll y){return x<y?x:y;}
il ll abs(ll x){return x>0?x:-x;}
il void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
il void read(ll &x){//快读 
    x=0;ll f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    x*=f;
}
using namespace std;
#define N 500010
struct Trie{
    ll val[N],ch[N][26],sz;
    Trie(){
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
        memset(val,0,sizeof(val));
    }
    ll idx(char c){return c-'a';}
    void insert(char *s){
        ll u=0,len=strlen(s+1);
        for(ll i=1;i<=len;i++){
            ll c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
    }
    ll search(char *s){
        ll u=0,len=strlen(s+1);
        for(ll i=1;i<=len;i++){
            ll c=idx(s[i]);
            if(!ch[u][c])return 0; 
            u=ch[u][c];
        }
        if(!val[u]){
            val[u]=1;return 1;
        }
        return 2;
    }
}tree;
ll n,m;
int main(){
    read(n);char s[100];
    for(ll i=1;i<=n;i++){
        scanf("%s",s+1);
        tree.insert(s);
    }
    read(m);
    for(ll i=1;i<=m;i++){
        scanf("%s",s+1);
        ll pd=tree.search(s);
        if(pd==0)printf("WRONG\n");
        else if(pd==1)printf("OK\n");
        else if(pd==2)printf("REPEAT\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值