最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

codeforcesRound#260(div2)D解题报告

来源:懂视网 责编:小采 时间:2020-11-09 08:01:20
文档

codeforcesRound#260(div2)D解题报告

codeforcesRound#260(div2)D解题报告:D. 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
推荐度:
导读codeforcesRound#260(div2)D解题报告:D. 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

解法:

首先存这些字符,用trie来存,通过trie就很容易联想到树型DP,这里的DP就不是取最优值之类的了,而是用来弄到达某个节点的胜负情况。

我们首先设节点v,win[v]代表已经组装好的字符刚好匹配到v了,然后需要进行下一步匹配时,先手是否可以赢,lose[v]则代表先手是否会输。

叶节点,win[v] = false, lose[v] = true.

其他节点 win[v] = win[v] | !win[child], lose[v] = lose[v] | !lose[child]. (因为每次赢的人,下一个就不是先手,所以结果肯定是跟下一个节点的赢成对立关系)。


如若win[0] = true , lose[0] = true则意味着第一局的人可以操控结果,否则按照k的次数来判断是否可以赢。

代码:

#include 
#include 
#define N_max 123456
#define sigma_size 26

using namespace std;

bool win[N_max], lose[N_max];
int n, k;
char st1[N_max];

class Trie{
public:
	int ch[N_max][sigma_size];
	int sz;

	Trie() {
	sz=0;
	memset(ch[0], 0, sizeof(ch[0]));
	}

	int idx(char c) {
	return c-'a';
	}

	void insert(char *s) {
	int l = strlen(s), u = 0;

	for (int i = 0; i < l; i++) {
	int c = idx(s[i]);

	if (!ch[u][c]) {
	ch[u][c] = ++sz;
	memset(ch[sz], 0, sizeof(ch[sz]));
	}

	u = ch[u][c];
	}
	}
};

Trie T;

void init() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++) {
	scanf("%s", st1);
	T.insert(st1);
	}
}

void dfs(int v) {
	bool is_leaf = true;

	win[v] = false;
	lose[v] = false;

	for (int i = 0; i < sigma_size; i++) {
	int tmp = T.ch[v][i];

	if (tmp) {
	is_leaf = false;
	dfs(T.ch[v][i]);
	win[v] |= !win[T.ch[v][i]];
	lose[v] |= !lose[T.ch[v][i]];
	}
	}

	if (is_leaf) {
	win[v] = false;
	lose[v] = true;
	}
}

void ans(bool res) {
	puts(res? "First":"Second");
}

void solve() {
	dfs(0);

	if (win[0] && lose[0])
	ans(true);
	else if (win[0])
	ans(k&1);
	else
	ans(0);
}

int main() {
	init();
	solve();
}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

codeforcesRound#260(div2)D解题报告

codeforcesRound#260(div2)D解题报告:D. 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
推荐度:
标签: 报告 解题 round
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top