调一上午了,求调
查看原帖
调一上午了,求调
758820
Porridge_Dust楼主2024/4/8 09:30
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 3e4 + 100;

int n;
char s[N];
int son[N][2], tot, vis[N];
int q[N], ne[N], vis2[N], vis3[N];

void insert () {
    int p = 0;
    for (int i = 1; s[i]; i ++ ) {
        int k = s[i] - '0';
        if (!son[p][k]) son[p][k] = ++ tot;
        p = son[p][k];
    }
    vis[p] = 1;
}

void build () {
    int l = 1, r = 0;
    for (int i = 0; i < 2; i ++ ) if (son[0][i]) q[ ++ r] = son[0][i];
    while (l <= r) {
        int p = q[l ++ ], v = ne[p];
        for (int i = 0; i < 2; i ++ ) {
            int u = son[p][i];
            if (!u) son[p][i] = son[v][i];
            else ne[u] = son[v][i], q[ ++ r] = u, vis[u] = vis[ne[u]];
        }
    }
}

bool dfs (int p) {
    vis2[p] = 1; vis3[p] = 1;
    int flag = 0;
    for (int i = 0; i < 2; i ++ ) {
        if (vis2[son[p][i]]) return 1;
        if (!vis[son[p][i]] && !vis3[son[p][i]]) flag |= dfs(son[p][i]);
    }
    vis2[p] = 0;
    return flag;
}

int main () {
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> s + 1, insert();
    build ();
    if (!(son[0][0] > 0 && son[0][1] > 0)) {cout << "TAK" << '\n'; return 0;}
    if (dfs(0)) cout << "TAK" << '\n';
    else cout << "NIE" << '\n';
    return 0;
}

一直都是60分 hack1过不去

2024/4/8 09:30
加载中...