社区讨论

不是妹子,学OI很久了,求助

P2444[POI 2000] 病毒参与者 9已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mi6zge2k
此快照首次捕获于
2025/11/20 13:20
4 个月前
此快照最后确认于
2025/11/20 15:46
4 个月前
查看原帖
rt,谜一样的45分(WAWA大哭poi)
求dalao帮忙查错poi
CPP
// luogu-judger-enable-o2
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX(a,b)	a=max(a,b)
#define MIN(a,b)	a=min(a,b)
#define ll long long
const int MAXN = 1000005;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;

template <class T>
inline void CLR(T &g) {
    T t;
    swap(t, g);
}

template <class T>
inline void CLR(T &g, int a) {
    memset(g, a, sizeof g);
}

ll L;
int N, M, K, Q;
char s[MAXN];

class AC {
public:
    struct node {
        int ch[2], c, end, fail, fa;
        void init() {
            ch[1] = ch[0] = 0;
            end = fail = fa = 0;
        }
    }p[MAXN];
    int cnt, root;
    void init() {
        cnt = 0;
        root = New();
    }
    int New() {
        return p[++cnt].init(), cnt;
    }
    void add(char *s) {
        int len = strlen(s + 1), t = root;
        for (register int(i) = 1, _end_ = (len); (i) <= _end_; (i)++) {
            int c = (s[i] == '1');
            if (!p[t].ch[c]) {
                p[t].ch[c] = New();
                p[p[t].ch[c]].fa = t;
                p[p[t].ch[c]].c = c;
            }
            t = p[t].ch[c];
        }
        p[t].end = 1;
    }
    void bfs() {
        queue <int> q;
        q.push(root);
        while (q.size()) {
            int t = q.front();
            q.pop();
            for (register int(i) = 0, _end_ = (1); (i) <= _end_; (i)++)
                if (p[t].ch[i])
                    q.push(p[t].ch[i]);
            if (t == root) {
                p[t].fail = 0;
                continue;
            }
            int f = p[p[t].fa].fail;
            while (f && !p[f].ch[p[t].c])
                f = p[f].fail;
            if (!f)
                p[t].fail = root;
            else
                p[t].fail = p[f].ch[p[t].c];
            if (p[p[t].fail].end)
                p[t].end = 1;
        }
    }
    vector <int> g[MAXN];
    int dfn[MAXN], low[MAXN], ins[MAXN], dfsclk;
    stack <int> st;
    int tarjan(int u) {
        if (p[u].end) {
            dfn[u] = low[u] = INF;
            return 0;
        }
        dfn[u] = low[u] = ++dfsclk;
        st.push(u);
        ins[u] = 1;
        for (vector<int>::iterator i = g[u].begin(); i != g[u].end(); i++) {
            int v = *i;
            if (!dfn[v]) {
                if (tarjan(v))
                    return 1;
                MIN(low[u], low[v]);
            }
            else if (ins[v])
                MIN(low[u], dfn[v]);
        }
        if (low[u] != dfn[u])
            return 1;
        st.pop();
        ins[u] = 0;
        return 0;
    }
    bool chk() {
        CLR(dfn, 0);
        CLR(low, 0);
        CLR(ins, 0);
        dfsclk = 0;
        while (st.size())
            st.pop();
        for (register int(i) = 1, _end_ = (cnt); (i) <= _end_; (i)++)
            if (!p[i].end)
                for (vector<int>::iterator j = g[i].begin(); j != g[i].end(); j++)
                    if ((*j) == i)
                        return true;
        for (register int(i) = 1, _end_ = (cnt); (i) <= _end_; (i)++)
            if (!dfn[i])
                if (tarjan(i)) return true;
        return false;
    }
    int dfs(int u) {
        int ret = 0;
        for (vector<int>::iterator i = g[u].begin(); i != g[u].end(); i++)
            MAX(ret, dfs(*i));
        return ret + 1;
    }
    bool solve() {
        for (register int(i) = 1, _end_ = (cnt); (i) <= _end_; (i)++) {
            CLR(g[i]);
            if (p[i].end) continue;
            for (register int(j) = 0, _end_ = (0); (j) <= _end_; (j)++) {
                int t = i;
                while (t && !p[t].ch[j])
                    t = p[t].fail;
                if (!t)
                    g[i].push_back(root);
                else if (!p[p[t].ch[j]].end)
                    g[i].push_back(p[t].ch[j]);
            }
        }
        if (chk())
            return true;
        int tmp;
        if ((tmp = dfs(root))>L)
            return true;
        return false;
    }
}ac;

int main() {
    int T, o = 0;
    scanf("%d", &N);
    L = 10000000000LL;
    ac.init();
    for (register int(i) = 1, _end_ = (N); (i) <= _end_; (i)++) {
        scanf("%s", s + 1);
        ac.add(s);
    }
    ac.bfs();
    printf("%s\n", ac.solve() ? "TAK" : "NIE");
    return 0;
}
后排说明:其实我是妹子poi

回复

14 条回复,欢迎继续交流。

正在加载回复...