神奇的问题
查看原帖
神奇的问题
141599
sinsop90楼主2022/6/12 11:57

是这样的, 我刚刚把这题写了一次, 然后我建的树的根是1.这玩意会错, 因为fail指针会挂掉

但是我刚刚不知道这个问题, 样例过了我就交了上去, 结果它过了..

接着我去做加强版, 样例过不去(也是因为建树用的根是1), 我用简单版的代码跑了一次, 输出错了, 我觉得很神奇, 就看了一下才发现这个问题。

所以是数据太水还是啥..

错误代码:

#include <bits/stdc++.h>
using namespace std;
char mp[1000005], s[1000005];
int cnt = 1, p[1000005];
int n, vis[1000005];
struct node {
	int son[28], fail;
}ch[1000005];
void build() {
	int u = 1, m = strlen(mp + 1);
	for(int i = 1;i <= m;i++) {
		if(ch[u].son[mp[i] - 'a']) u = ch[u].son[mp[i] - 'a'];
		else {
			ch[u].son[mp[i] - 'a'] = ++ cnt;
			u = cnt;
		}
	}
	p[u] ++;
}
queue<int> Q;
void fail_find() {
	for(int i = 0;i <= 25;i++) {
		if(ch[1].son[i]) {
			ch[ch[1].son[i]].fail = 1;
			Q.push(ch[1].son[i]);
		}
	}
	while(!Q.empty()) {
		int u = Q.front();
		Q.pop();
		for(int i = 0;i <= 25;i++) {
			if(ch[u].son[i]) {
				ch[ch[u].son[i]].fail = ch[ch[u].fail].son[i];
				Q.push(ch[u].son[i]);
			}
			else ch[u].son[i] = ch[ch[u].fail].son[i];
		}
	}
}
void iste() {
	int u = 1, m = strlen(s +1), sum = 0;
	for(int i = 1;i <= m;i++) {
		int c = ch[u].son[s[i] - 'a'];
		while(c && !vis[c]) {
			sum += p[c];
			vis[c] = 1;
			c = ch[c].fail;
		}
		u = ch[u].son[s[i] - 'a'];
	}
	cout <<sum <<endl;
}
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		cin >> mp + 1;
		build();
	}
	fail_find();
	cin >> s + 1;
	iste();
} 

用加强版的样例

6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha

就可以卡掉, 应该输出5, 但是输出1

2022/6/12 11:57
加载中...