题目链接
题解:可以想到先建一棵trie树,然后每次转移就是在一个dag上转移。就自然的想到sg函数。但是此题目玩多次游戏,且输的一方要换先手。且最后一局才分胜负。我们可以从后往前,从最后一局游戏的胜负考虑。
分析:若sg = 0,则此时最后一局后手必胜。想要获得后手,则上一局游戏必胜。又因为上一局后手必胜,由此推到,第一局游戏的后手将获得最后胜利。
若sg = 1,则此时相当于每次取一个石子。别无选择。所以我们判奇偶性
若sg >1,则最后我们要做先手,我们上一局要输。但是sg函数是用来判断必胜点的。意思就是假设我们当前sg = 0,不意味着后手就傻傻的要我们输,因为可能sg=0可以往sg>0上转移。所以后手也可以让我们赢。所以我们要判断可败点。
则有:
叶子是可败点
若一个点是可败点,那么其后继状态有一个只能胜点
若一个点是只能胜点,其后继状态必然都是可败点
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5+5;
const int sigma_size = 26;
int tot=1;int ch[maxn][26];
void insert(char *s){
int len = strlen(s);
int u = 0;
for(int i=0;i<len;i