蒟蒻刚学AC自动机,第二个点本地AC,提交WA
查看原帖
蒟蒻刚学AC自动机,第二个点本地AC,提交WA
490522
CaoXian楼主2021/8/30 21:38

普通的AC自动机模板。

数据点下下来了,答案是对的,但提交WA。

输中量参解改都试过了,也不是初始化的问题。

(结构体名称和变量名不要管

#include <bits/stdc++.h>
#define QAQ return 0;
using namespace std;
queue<int> q;
int n, cnt, nxt[1000005], child[1000005][27], sum[1000005];
struct ACzidongji {
	void insert(const char s[]) const {
		int num, p = 0, len = strlen(s + 1);
		for(int i = 1; i <= len; ++i) {
			num = s[i] - 'a' + 1;
			if(!child[p][num]) child[p][num] = ++cnt;
			p = child[p][num];
		}
		++sum[p];
	}
	int find(const char s[]) const {
		int num, p = 0, ret = 0, len = strlen(s + 1);
		for(int i = 1; i <= 26; ++i) if(child[0][i]) nxt[child[0][i]] = 0, q.push(child[0][i]);
		while(!q.empty()) {
			num = q.front();
			q.pop();
			for(int i = 1; i <= 26; ++i)
				if(!child[num][i]) child[num][i] = child[nxt[num]][i];
				else {
					q.push(child[num][i]);
					nxt[child[num][i]] = child[nxt[num]][i];
				}
		}
		for(int i = 1; i <= len; ++i) {
			num = s[i] - 'a' + 1;
			p = child[p][num];
			for(int t = p; t && ~sum[t]; t = nxt[t]) ret += sum[t], sum[t] = -1;
		}
		return ret;
	}
} ac;
char s[1000005];
int main() {
//	freopen("P3808_2.in", "r", stdin);
	scanf("%d", &n);
	gets(s + 1);
	while(n--) {
		gets(s + 1);
		ac.insert(s);
	}
	gets(s + 1);
	printf("%d", ac.find(s));
	QAQ
}
2021/8/30 21:38
加载中...