60pts 求条
查看原帖
60pts 求条
1401095
zhangchengqi666楼主2025/7/19 11:59

全是 TAK,求条,在线等

#include <bits/stdc++.h>

using namespace std;

const int N = 100000 + 5;

int n, cnt;

int son[N][3], fail[N];

bool d[N], vis[N], vis2[N];

queue<int> q;

void insert(string s) {
	int p = 0;
	for (int i = 0; i < (int)s.size(); i++) {
		if (!son[p][s[i] - '0']) son[p][s[i] - '0'] = ++cnt;
		p = son[p][s[i] - '0'];
	}
	d[p] = true;
}

void get_fail() {
	for (int i = 0; i < 2; i++) {
		if (son[0][i]) {
			q.push(son[0][i]);
		}
	}
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (int i = 0; i < 2; i++) {
			int v = son[u][i];
			if (v) {
				q.push(v);
				int p = fail[u];
				while (p && !son[p][i]) {
					p = fail[p];
				}
				if (p) {
					fail[v] = son[p][i];
					d[v] |= d[son[p][i]];
				} else {
					fail[v] = 0;
				}
			} else {
				son[u][i] = son[fail[u]][i];
			}
		}
	}
}

void dfs(int u) {
	if (vis[u]) {
		cout << "TAK";
		exit(0);
	}
	if (vis2[u] || d[u]) return;
	vis[u] = vis2[u] = true;
	for (int i = 0; i < 2; i++) {
		dfs(son[u][i]);
	}
	vis[u] = false;
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		string x;
		cin >> x;
		insert(x);
	}
	get_fail();
	dfs(0);
	cout << "NIE";
	return 0;
}
2025/7/19 11:59
加载中...