社区讨论
不是妹子,学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;
}
回复
共 14 条回复,欢迎继续交流。
正在加载回复...