codeforces_455B
2016-04-13 21:44
381 查看
B. A Lot of Games
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
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.
Input
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.
Output
If the player who moves first wins, print "First", otherwise print "Second" (without the quotes).
Examples
input
output
input
output
input
output
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
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.
Input
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.
Output
If the player who moves first wins, print "First", otherwise print "Second" (without the quotes).
Examples
input
2 3 a b
output
First
input
3 1 a b c
output
First
input
1 2 ab
output
Second 题意:有n(n<=100000)个单词,两个人比赛,规则为:最开始字符串为空,两人轮流每次填一个字母,使该字符串为这n个单词其中一个的前缀,当一个人不能再填入字母时,他就输了,比赛进行k次,第k次比赛胜者为最终胜者。 思路:最开始毫无思路,跟着别人的题解走了一遍。将所有单词构建一颗字典树,再进行博弈。第一道博弈和字典树。1表示先手败,2表示先手胜,3表示能胜能负。先手必败则,先手一直先手,最后一局后手胜;先手胜则下一局成后手,即为胜败交替,此时,最后一句的胜败决定于k的奇偶性;能胜能败,则先手前k-1局败,最后一句先手且胜。简单博弈。
#include<iostream> #include<cstdio> #include<cstring> #include<malloc.h> using namespace std; #define maxn 100005 char s[maxn]; //int next[maxn][30],root,top; struct Trie { Trie *next[26]; }; Trie* createtrie(char *str,Trie* root) //创建字典树 { int len=strlen(str); Trie *p=root,*q; for(int i=0; i<len; i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { q=(Trie *)malloc(sizeof(Trie)); //q->v=1; for(int j=0; j<26; j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { //p->next[id]->v++; p=p->next[id]; } } //p->v=-1; return root; } int solve(Trie *root) //博弈 { int ok=0,ans=0; for(int i=0; i<26; i++) { if(root->next[i]!=NULL) { ok=1; ans|=solve(root->next[i])^3; } } if(!ok) ans=1; return ans; } int main() { int n,k; //top=root=1; Trie* root; scanf("%d%d",&n,&k); root=(Trie*)malloc(sizeof(Trie)); for(int j=0; j<26; j++) root->next[j]=NULL; for(int i=0; i<n; i++) { scanf("%s",s); root=createtrie(s,root); } //output(root); int tmp=solve(root); //cout<<tmp<<endl; if(tmp==3) printf("First\n"); else if(k&1&&tmp==2) printf("First\n"); else printf("Second\n" ); return 0; }
相关文章推荐
- Access转成Sql 2008步骤,同时解决自动编号问题,主键,id数值不重置
- 虚拟机类的加载过程
- java 树递归
- java8新语法学习
- JDK安装与环境变量配置
- 线段树 2016.4.15
- Golang实现ping
- sleep()方法和yield()方法的区别
- 【c语言】一个字符串,包含n个字符。将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
- poj_1236_Network of Schools
- 软件工程_6th weeks
- (java)从零开始之--异常处理(以文件拷贝为例)
- Java中的XML
- HDU1171(01背包)
- CountDownLatch
- oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
- POJ 3181 Dollar Dayz【递推 拆分存大数】
- 交通图最短路径算法
- java中的序列化与反序列化
- 【c语言】有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数