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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 测试sleep()和pthread_cond_timewait()之间的区别

    测试sleep()和pthread_cond_timewait()之间的区别用来测试sleep()和pthread_cond_timewait()之间的区别通过#if0/1来分别测试当从终端输入q时,通过打印来判断是否可以立即返回结束线程,还是要等睡眠时间到了才能结束线程。当条件满足时,pthread_cond_signal()来触发代码#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;strin…

    2022年5月20日
  • clion 激活码2022_在线激活「建议收藏」

    (clion 激活码2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlFZP9ED60OK-eyJsaWN…

    2022年4月1日
  • 40款帮助你加薪的IDEA神器插件![通俗易懂]

    写在前面的话:大家好,我是全栈小刘,一名零零后的编程爱好者。从初中开始编程,对编程有独特情怀,热爱技术,目前已有五年的编程经验,做过许许多多有意思的项目,这篇博客,算是对自己学习的一个总结,算是一份笔记,如果你对Java全栈感兴趣可以关注我的动态一起学习1.01的365次方=37.78343433289>>>10.99的365次方=0.02551796445…

    2022年4月17日
  • state-of-the-art implementations related to visual recognition and search

    state-of-the-art implementations related to visual recognition and search

    2022年1月6日
  • fun.xls.exe病毒分析、查杀及批处理清除「建议收藏」

    fun.xls.exe病毒分析、查杀及批处理清除「建议收藏」大家经常用U盘,也许就和我一样,遇到过这种叫fun.xls.exe的病毒.fun.xle.exe是一种叫做U盘病毒tel.xls.exe的变种,会在电脑里注入文件,这个病毒目前应该有四个变种.用记事本打开AUTORUN是如下代码:[AutoRun]open=fun.xls.exeshellexecute=fun.xls.exeshell\Auto\command=fu…

    2022年10月4日
  • Jmeter 之正则表达式提取器应用「建议收藏」

    Jmeter 之正则表达式提取器应用「建议收藏」目录前言一、获取单个数据二、获取多个数据个人觉得非常非常细节的地方注意一下:前言说到Jmeter正则表达式提取器的应用,就不得不说到关联。所谓关联,就是把应用中动态变化返回的数据获取到,把它保存为一个参数,提供给后面需要用到的地方进行使用。Jmeter中关联可以通过“添加—后置处理器—正则表达式提取器”来获取数据,且注意正则表达式提取器附在需要获取数据的某个采样器之下,数据一般从“查看结果树“的响应数据获取。Jmeter中关联可以通过“添加—后置处理器—正则表达式提.

    2022年9月10日

发表回复

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

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