码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

时间:2019-09-11 20:04:27      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:force   its   mes   --   std   %s   size   一个   return   

 

题目链接:

http://codeforces.com/gym/101161/attachments

题意:

给一个可以变化的字典树

在字典树上删边

如果某条边和根节点不连通那么这条边也删除

谁没得删就输了

数据范围:

$1\leq n \leq 100000$

$1\leq q \leq 100000$

$1\leq |s| \leq 40$

分析: 

 

ac代码:

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn = 1e5+7;
int sg[maxn*41],son[maxn*41][26],f[maxn*41],cnt;
char s[45];
int ins(){
    int now=0;
    int len=strlen(s+1);
    for(int i=1;i<=len;i++){
        int v=s[i]-‘a‘;
        if(son[now][v])now=son[now][v];
        else {
            cnt++;
            f[cnt]=now;
            son[now][v]=cnt;
            now=cnt;
            sg[cnt]=len-i;
            if(i==len)
                return cnt;
        }
    }
    return 0;
}
void up(int x){
    sg[x]=0;
    for(int i=0;i<26;i++)
        if(son[x][i])sg[x]^=(sg[son[x][i]]+1);
    if(x==0)return ;
    up(f[x]);
}
int main()
{
    int T,n,q;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",s+1);
            int v=ins();
            up(v);
        }
        scanf("%d",&q);
        printf("Case %d:\n",cas);
        while(q--){
            scanf("%s",s+1);
            int v=ins();
            up(v);
            if(sg[0])printf("1\n");
            else printf("2\n");
        }
        for(int i=0;i<=cnt;i++)
            for(int j=0;j<26;j++)son[i][j]=0;
        cnt=0;
    }
    return 0;
}

  

codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

标签:force   its   mes   --   std   %s   size   一个   return   

原文地址:https://www.cnblogs.com/carcar/p/11508092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!