要想好有兩種情況:
1. 是否可先手求勝
2. 是否可先手求敗
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<vector> #include<utility> #include<map> #include<set> #include<queue> #include<cmath> #define nullptr nptr using namespace std; typedef long long int int64; struct _node{ _node* ch[26];}; typedef _node node; node* nptr; node* newnode(){ node* nn = new node(); for(int lx = 0;lx < 26;lx++) nn->ch[lx] = nullptr; return nn; } node* root; void addword(char* str, node* rt){ char ch = str[0]; if(ch == 0) return; if(rt->ch[ch-'a'] == nullptr) rt->ch[ch-'a'] = newnode(); addword(str+1, rt->ch[ch-'a']); return; } char buf[100011]; int dp(node* rt){ int cnt[2] = {0}; for(int lx = 0;lx < 26;lx++) if(rt->ch[lx] != nullptr) cnt[dp(rt->ch[lx])]++; return (cnt[0] > 0); } int dp2(node* rt){ int cnt[2] = {0}; for(int lx = 0;lx < 26;lx++) if(rt->ch[lx] != nullptr) cnt[dp2(rt->ch[lx])]++; if(cnt[0] + cnt[1] == 0) return 1; else return cnt[0]>0; } int main() { root = newnode(); int n, k;scanf("%d %d", &n, &k); for(int lx = 0;lx < n;lx++){ scanf("%s", buf); addword(buf, root); } int val0 = dp(root); // 先手求勝 int val1 = dp2(root); // 先手求敗 //printf("%d %d\n", val0, val1); if(val0 == 0) puts("Second"); else puts(((k+val1)%2) ? "First":"Second"); return 0; }
沒有留言:
張貼留言