Codeforces Round #260 (Div. 2) D
1 second
256 megabytes
standard input
standard output
Andrew, Fedor and Alex are inventive guys. Now they invent the game with strings for two players.
Given a group of n non-empty strings. During the game two players build the word together, initially the word is empty. The players move in turns. On his step player must add a single letter in the end of the word, the resulting word must be prefix of at least one string from the group. A player loses if he cannot move.
Andrew and Alex decided to play this game k times. The player who is the loser of the i-th game makes the first move in the (i + 1)-th game. Guys decided that the winner of all games is the player who wins the last (k-th) game. Andrew and Alex already started the game. Fedor wants to know who wins the game if both players will play optimally. Help him.
The first line contains two integers, n and k (1 ≤ n ≤ 105; 1 ≤ k ≤ 109).
Each of the next n lines contains a single non-empty string from the given group. The total length of all strings from the group doesn't exceed 105. Each string of the group consists only of lowercase English letters.
If the player who moves first wins, print "First", otherwise print "Second" (without the quotes).
2 3
a
b
First
3 1
a
b
c
First
1 2
ab
Second
题意:给出一些字符串,要求每次两个人轮流取字符放在一个新串的后面,使得新串是已知字符串集合中的前缀,第k次胜利的则最后胜利。 判断胜负情况。
sl :很久就见过这个题目,今天终于算是补上了(又是一道老提) 。 树形dp一下,记录到当前节点的胜负情况。
注意:由于做trie树时设置了一个虚拟节点0 所以递归到叶子节点的时候胜负有所颠倒。
然后得到0节点的胜负情况。如果win[0]=true&&false =true;也就是当前节点可胜可负,完全取决第一个人,所以这种情况第一个人胜利。
然后就是win[0]=true. false[0]=false ; 也就是谁先取谁胜。 这取决游戏的次数。
注意特判1次的情况。剩下的就很简单了。
1 //by caonima
2 //hehe
3 #include <bits/stdc++.h>
4 using namespace std;
5 const int MAX = 1e5+;
6 int win[MAX],lose[MAX],G[MAX][];
7 char str[MAX];
8 int n,k,cur;
9 void insert(char *S) {
int root=;
for(int i=;S[i];i++) {
int x=S[i]-'a';
if(!G[root][x]) {
G[root][x]=++cur;
}
root=G[root][x];
}
}
void dfs(int u) {
int is_left=true,v;
win[u]=lose[u]=false;
for(int i=;i<=;i++) {
if(v=G[u][i]) {
dfs(v); is_left=false;
win[u]|=!win[v];
lose[u]|=!lose[v];
}
}
if(is_left) lose[u]=true;
}
void gao() {
dfs();
// printf("%d %d",win[0],lose[0]);
if(k==) {
win[] ? printf("First\n") : printf("Second\n");
}
else if(win[]&&lose[]) {
printf("First\n");
}
else if(win[]) {
(k&) ? printf("First\n") : printf("Second\n");
}
else {
printf("Second\n");
}
}
int main() {
while(scanf("%d %d",&n,&k)==) {
cur=;
for(int i=;i<=n;i++) {
scanf("%s",str);
insert(str);
}
gao() ;
}
return ;
}
Codeforces Round #260 (Div. 2) D的更多相关文章
- DP Codeforces Round #260 (Div. 1) A. Boredom
题目传送门 /* 题意:选择a[k]然后a[k]-1和a[k]+1的全部删除,得到点数a[k],问最大点数 DP:状态转移方程:dp[i] = max (dp[i-1], dp[i-2] + (ll) ...
- 递推DP Codeforces Round #260 (Div. 1) A. Boredom
题目传送门 /* DP:从1到最大值,dp[i][1/0] 选或不选,递推更新最大值 */ #include <cstdio> #include <algorithm> #in ...
- Codeforces Round #260 (Div. 2)AB
http://codeforces.com/contest/456/problem/A A. Laptops time limit per test 1 second memory limit per ...
- Codeforces Round #260 (Div. 1) D. Serega and Fun 分块
D. Serega and Fun Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/pro ...
- Codeforces Round #260 (Div. 1) C. Civilization 并查集,直径
C. Civilization Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/probl ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
A. Boredom Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/problem/A ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- Codeforces Round #260 (Div. 1) 455 A. Boredom (DP)
题目链接:http://codeforces.com/problemset/problem/455/A A. Boredom time limit per test 1 second memory l ...
- Codeforces Round #260 (Div. 2)
A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...
- Codeforces Round #260 (Div. 2) C
Description Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. On ...
随机推荐
- bzoj 1691: [Usaco2007 Dec]挑剔的美食家【贪心+splay】
高端贪心,好久没写splay调了好久-- 以下v为价格,w为鲜嫩度 把牛和草都按v排升序,扫草,首先把v小于等于当前草的牛都丢进splay,这样一来splay里全是可选的牛了,按w排序,然后贪心的为当 ...
- winMTR的使用
WinMTR下载链接:http://pan.baidu.com/share/link?shareid=236531&uk=1126982975 WinMTR 使用方法及软件介绍: WinMTR ...
- MvcPager 分页控件
官方教程: http://www.webdiyer.com/mvcpager
- ACM_蛇形矩阵
蛇行矩阵 Time Limit: 4000/2000ms (Java/Others) Problem Description: 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. Input: ...
- 377 Combination Sum IV 组合之和 IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- Hadoop Hive概念学习系列之HiveQL编译基础(十)
由客户端提交的HiveQL语句将最终被转换为一个或多个MapReduce任务并提交由Hadoop执行.不包含聚合和连接的简单SELECT语句可以使用一个单独的只包含Map阶段的任务实现.使用GROUP ...
- mysql中数据库的设计
软件开发流程(CMMI): 1):项目启动; 2):项目计划: 3):需求分析; 需要得到的结果是什么? 4):系统设计; 该怎么做? 5):系统开发; 6):系统测试; 7):系 ...
- pom.xml详情
这里借鉴一下csdn中的一个系列的博客: 第一篇:POM文件详解 第二篇:maven中的依赖作用范围 第三篇:maven中的可选依赖和依赖排除 第四篇:maven中的dependencies和depe ...
- activity生命周期知识点整理
activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...
- Python学习日记之字典深复制与浅复制
Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...