Codeforces 455B A Lot of Games(字典树+博弈)[通俗易懂]

Codeforces 455B A Lot of Games(字典树+博弈)

大家好,又见面了,我是全栈君。

题目连接: Codeforces 455B A Lot of Games

题目大意:给定n。表示字符串集合。

给定k,表示进行了k次游戏,然后是n个字符串。每局開始。字符串为空串,然后两人轮流在末尾追加字符。保证新的字符串为集合中某字符串的前缀。不能操作者输,新一轮由上一句输的人先手。

解题思路:首先对字符集合建立字典树。然后依据博弈的必胜必败性质搜索出先手的决策状态,可决定胜败3,仅仅能胜利2,仅仅能失败1。不可掌控(即对手可决定胜败)0。
对于状态3,为必胜。能够採用前K-1场败,然后保证第K场自己先手,取必胜方案。


对于状态2,不管则们走都是赢的话,肯定是两个人轮流胜局,所以推断K的奇偶性。
对于状态1和0,必败。由于一直输,一直先手。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1e5+5;

struct node {
    int val, arr[30];
    node () {
        val = 0;
        memset(arr, 0, sizeof(arr));
    }
}t[maxn*2];

int top = 1, len, n, k;
char str[maxn];

inline int get_node () {
    return top++;
}

void insert (int x, int d) {

    if (d == len)
        return;

    int mv = str[d] - 'a';
    if (t[x].arr[mv] == 0)
        t[x].arr[mv] = get_node();
    insert(t[x].arr[mv], d+1);
}

int solve (int x) {

    int& ans = t[x].val;
    ans = 0;

    bool flag = true;
    for (int i = 0; i < 26; i++) {
        if (t[x].arr[i]) {
            flag = false;
            ans |= solve(t[x].arr[i]);
        }
    }

    if (flag)
        ans = 1;
    return 3-ans;
}

int main () {
    scanf("%d%d", &n, &k);

    for (int i = 0; i < n; i++) {
        scanf("%s", str);
        len = strlen(str);
        insert(0, 0);
    }

    solve(0);
    int ans = t[0].val;
    if (ans < 2)
        printf("Second\n");
    else if (ans == 2)
        printf("%s\n", k&1 ? "First" : "Second");
    else
        printf("First\n");
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116051.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript常用基础算法「建议收藏」

    JavaScript常用基础算法「建议收藏」一、字符串1.字符串中出现最多次数的字符functionfindMaxDuplicateChar(str){varcnt={},//用来记录所有的字符的出现频次c="";//用来记录最大频次的字符for(vari=0;i<str.length;i++){varci=str[i];if(!cnt[ci]){

    2022年10月5日
    3
  • propertydescriptor是用来干什么的_constructor java

    propertydescriptor是用来干什么的_constructor java1、PropertyDescriptor简述PropertyDescriptor对象是位于java.beans包下的工具类,顾名思义为属性描述器,通常我们用于通过反射获取对象方法的时候,下面来看一下常用的用法吧!2、PropertyDescriptor用法(1)、给你一个java对象,你如何生成PropertyDescriptor对象呢?通常,我们会用到…

    2022年10月1日
    4
  • w3c标准是什么_语言的特征主要包括什么

    w3c标准是什么_语言的特征主要包括什么什么是W3C标准站点标准(SiteStandard)不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML;表现标准语w3c网页标准,具体指那些?CSS布局HTML小编今天和大家分享高手指教,。WEB标准不是某一个标准,而是一系列标准的…

    2025年12月13日
    1
  • Centos7安装nginx1.8.0步骤

    Centos7安装nginx1.8.0步骤前言Nginx(enginex)是一个高性能的HTTP和反向代理web服务器nginx安装环境》nginx是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境。gcc安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,(一)安装gcc:yuminstallgcc-c++PCREPCRE(PerlCompatibleRegularExpressions)是一个Perl库,包括perl兼容的正则表达式库。ng

    2022年6月6日
    70
  • 2019-07高德地图行政区域省市区json数据获取(php代码)

    2019-07高德地图行政区域省市区json数据获取(php代码)写在前面从省向下查三级,高德县级市的子级会返回街道,正常的市正常返回子级为区。具体高德api参数详情请查看https://lbs.amap.com/api/webservice/guide/api/district代码//获取json数据publicfunctiongetDataAction(){set_time_limit(0);$url=”…

    2022年6月21日
    27
  • 跨平台应用开发进阶(十五) :uni-app 自定义 showToast并实现下载进度条

    跨平台应用开发进阶(十五) :uni-app 自定义 showToast并实现下载进度条大话设计模式(四)单例模式的优与劣前言首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例。简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,

    2022年6月20日
    259

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号