首页 > 其他分享 >AtCoder Beginner Contest 278

AtCoder Beginner Contest 278

时间:2022-11-24 11:26:43浏览次数:76  
标签:AtCoder Beginner int 单词 vis needc 278 include sides

F - Shiritori 》

博弈

 

 

 首先在这个博弈题中有个很重要的结论:

  1.如果一个点,走一步,能够到达的点如果其中有一个为先手必胜点,那么这个点必然是先手必败点

  2.如果一个点,走一步,能够到达的点如果全部为先手必败点,那么这个点必然是先手必胜点

这道题如果用爆搜的方式:

首先我们可以根据他的单词首尾相连的方式建个图,这个建图很有讲究,可以在O(n)的时间内建出

 

 

 即就是将开头为c的单词的下标i,保存在集合中,然后

在尾部为单词needc时,就去找头部为needc的单词

 

 

 注意这里的爆搜是要回溯的,因为全局的状态会根据搜索的起始点儿不同,比如:

 

 

 于是:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <vector>
 5 using namespace std;
 6 const int N = 20;
 7 // dp[i]表示以第i个字符串为先手最终的结果
 8 //-1表示最初始的状态,1表示先手必胜,0表示先手必败
 9 int dp[N], n;
10 string str[N];
11 // sides[i]表示以字母i开头的字符有哪些
12 vector<int> sides[2 * N];
13 // dfs时有用
14 bool vis[N];
15 int dfs(int u)
16 {
17     int needc = str[u].back() - 'a';
18     for (int i = 0; i < sides[needc].size(); i++)
19     {
20         int to = sides[needc][i];
21         if (!vis[to])
22         {
23             vis[to] = true;
24             if (dfs(to))
25             {
26                 vis[to] = false;
27                 return dp[u] = 0;
28             }
29             vis[to] = false;
30         }
31     }
32     return dp[u] = 1;
33 }
34 int main()
35 {
36     cin >> n;
37     for (int i = 1; i <= n; i++)
38     {
39         cin >> str[i];
40         int c = str[i][0] - 'a';
41         sides[c].push_back(i);
42     }
43     for (int i = 1; i <= n; i++)
44     {
45         vis[i] = true;
46         if (dfs(i))
47         {
48             cout << "First" << endl;
49             return 0;
50         }
51         vis[i] = false;
52     }
53     cout << "Second" << endl;
54     return 0;
55 }

然鹅会超时,按照状态压缩我还不理解:

 

 

 

 

 这里我有很多疑惑点:

1.这里枚举k,如果枚举的最后的一个单词,根本不存在怎么办?

比如状态1111011是枚举到的,但是枚举到的单词k根据不存在于任何上面的状态单词中怎么办?

  《AtCoder Beginner Contest 209 E - Shiritori 》

 

 

 

 

 

标签:AtCoder,Beginner,int,单词,vis,needc,278,include,sides
From: https://www.cnblogs.com/cilinmengye/p/16921208.html

相关文章

  • AtCoder Beginner Contest 237 Ex Hakata
    洛谷传送门AtCoder传送门下文令\(|S|=n\)。引理:一个字符串中本质不同的回文串数量\(\len\)。证明:考虑每在字符串末尾添加一个字符,本质不同回文串数量最多增加......
  • 2785. 信号增幅仪
    题目链接2785.信号增幅仪无线网络基站在理想状况下有效信号覆盖范围是个圆形。而无线基站的功耗与圆的半径的平方成正比。现给出平面上若干网络用户的位置,请你选择一......
  • BZOJ2783-[JLOI2012]树
    2783:[JLOI2012]树TimeLimit: 1Sec  MemoryLimit: 128MBDescription数列提交文件:sequence.pas/c/cpp输入文件:sequence.in输出文件:sequence.out问题描......
  • AtCoder Grand Contest 025B - RGB Coloring
    题解:一开始想把AA,BB,AA+B......
  • Atcoder ABC 277 A - E
    **A^{-1}**题意:给定一个序列,和一个指定值,输出这个值在序列中的位置(序列的下标从1开始)思路:签到题时间复杂度:O(n)代码:#include<bits/stdc++.h>usingnamespacestd;......
  • AtCoder 题解集
    虽然暂时不知道会不会从XCPC中退役,但还是想把这个题解集给维护下去。\(created\;at\;2022/6/24\;by\;Roshin\)目录AGCARCABCABC138F.Coincidence(结论,数位DP)AB......
  • AtCoder Beginner Contest 278
    Preface刚打完就来写题解,热乎的很这周CF没Div2,Atcoder的ARC和微积分考试撞了打不了所以和ztc一起打一下Div3和ABC,顺便锻炼一波解释题目的能力做到G的时候还有30min的,然......
  • AtCoder Regular Contest 152 (A-D)
    根本不知道有ARC。然后unratedregister。然后一直在聊天,只写了A。难蚌。按照pog的说法,这场应该不看题直接写代码!!1这样才能写的飞快。摆了一上午。我好像一直在贺题,所以......
  • AtCoder Beginner Contest 278-F
    F-Shiritori题解:n最大16,所以可以状态压缩,相当于n个点的带权有向图。dp[i][j]表示当前状态为i,j结尾的情况,其中dp[i][j]=1表示First赢,0为second赢,如果一个字符串s[i],第......
  • ABC278 整合题解
    AA题,送分题。link。思路数据范围很小,其实直接模拟也是可以通过的。不过我们很容易想到\(O(n)\)的算法。对于前\(k\)个数,不输出,其他数正常输出。然后再在末尾......