分析:
这道题很有意思啊。一开始我一直想找规律什么的,但并找不到。
后来发现自己naive了,不光一局之中不能找到规律,K局也会影响到最后的结果。如果先手拥有主动权,可以控制自己的输赢,让自己一直输,最后一局再赢。
于是题目变成了建一颗字典树,然后遍历一遍,找找是否有先手必胜或必败态。再考虑。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <map>
#include <vector>
using namespace std;
const int maxn = 1e5 + 5;
int ch[maxn][30];
int sz = 1;
void trie_insert(char *s) {
long len = strlen(s);
int u = 0;
for (int i = 0; i < len; i ++) {
int c = s[i] - 'a';
if (!ch[u][c]) {
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][c] = sz ++;
}
u = ch[u][c];
}
}
bool win(int u) {
int f = 0, s = 0;
for (int c = 0; c < 26; c ++) {
int v = ch[u][c];
if (!v) continue;
if (win(v)) s ++;
else f ++;
}
if (f) return true;
return false;
}
bool lose(int u) {
int f = 0, s = 0;
for (int c = 0; c < 26; c ++) {
int v = ch[u][c];
if (!v) continue;
if (lose(v)) s ++;
else f ++;
}
if (!s && !f) return true;
if (f) return true;
return false;
}
int main(int argc, char const *argv[]) {
int N, K;
cin>>N>>K;
memset(ch[0], 0, sizeof(ch[0]));
for (int i = 0; i < N; i ++) {
char s[maxn];
scanf("%s", s);
trie_insert(s);
}
bool first_win = win(0);
bool first_lose = lose(0);
if (first_win && first_lose) puts("First");
else {
if (first_lose) puts("Second");
else if (first_win) {
if (K % 2) puts("First");
else puts("Second");
}
else puts("Second");
}
return 0;
}