结构体会降低速度吗?
查看原帖
结构体会降低速度吗?
773878
xukehg楼主2024/7/16 17:06

rt,用结构体:

#include <bits/stdc++.h>
using namespace std;
const int N = 3e4 + 5;

namespace ac{
	struct node{
		int fail;
		int nxt[31];
		int val;
	}AC[N];
	char s[N * 200 / 3];
	int dp[N * 200 / 3];
	int tot = 0,max_len = 0;
	void insert(int len){
		int now = 0;
		for (int i = 1;i <= len;++i){
			int c = s[i] - 'a';
			if (!AC[now].nxt[c]) AC[now].nxt[c] = ++tot;
			now = AC[now].nxt[c];
		}
		AC[now].val = len;
		max_len = max(max_len,len);
		return;
	}
	int st = 0,ed = 0;
	int q[N * 200 / 3];
	void bfs(){
		for (int i = 0;i < 26;++i) if (AC[0].nxt[i]) AC[AC[0].nxt[i]].fail = 0,q[++ed] = AC[0].nxt[i];
		while (st < ed){
			int r = q[++st];
			//cout << r << endl;
			for (int i = 0;i < 26;++i){
				if (AC[r].nxt[i]){
					AC[AC[r].nxt[i]].fail = AC[AC[r].fail].nxt[i];
					q[++ed] = AC[r].nxt[i];
				}
				else AC[r].nxt[i] = AC[AC[r].fail].nxt[i];
			}
		}
		return;
	}
	int ans = 0,now,c;
	int query(int len){
		for (int i = 1;i <= len;++i) dp[i] = 0;
		dp[0] = 1;
		ans = now = 0;
		for (int i = 1;i <= len;++i){
			//cout << i <<endl;
			if (ans + max_len < i) break;
			c = s[i] - 'a';
			now = AC[now].nxt[c];
			for (int j = now;j;j = AC[j].fail){
				dp[i] |= dp[i - AC[j].val];
				if (dp[i]) break;
			}
			if (dp[i]) ans = i;
		}
		return ans;
	}
}
inline void write(int x) {
	static int sta[35];
	int top = 0;
	do {
		sta[top++] = x % 10,x /= 10;
	} while (x);
	while (top) putchar(sta[--top] + 48);
}
int n,m;
int main(){
	using namespace ac;
	cin >> n >> m;
	while (n--){
		scanf("%s",s + 1);
		insert(strlen(s + 1));
	}
	//AC[0].fail = 0;
	bfs();
	while (m--){
		scanf("%s",s + 1);
		write(query(strlen(s + 1)));
		puts("");
	}
}

结果95分。

不用结构体:

#include <bits/stdc++.h>
using namespace std;
const int N = 3e4 + 5;

namespace ac{
	int fail[N];
	int nxt[N][31];
	int val[N];
	char s[N * 200 / 3];
	int dp[N * 200 / 3];
	int tot = 0,max_len = 0;
	void insert(int len){
		int now = 0;
		for (int i = 1;i <= len;++i){
			int c = s[i] - 'a';
			if (!nxt[now][c]) nxt[now][c] = ++tot;
			now = nxt[now][c];
		}
		val[now] = len;
		max_len = max(max_len,len);
		return;
	}
	int st = 0,ed = 0;
	int q[N * 200 / 3];
	void bfs(){
		for (int i = 0;i < 26;++i) if (nxt[0][i]) fail[nxt[0][i]] = 0,q[++ed] = nxt[0][i];
		while (st < ed){
			int r = q[++st];
			//cout << r << endl;
			for (int i = 0;i < 26;++i){
				if (nxt[r][i]){
					fail[nxt[r][i]] = nxt[fail[r]][i];
					q[++ed] = nxt[r][i];
				}
				else nxt[r][i] = nxt[fail[r]][i];
			}
		}
		return;
	}
	int ans = 0,now,c;
	int query(int len){
		for (int i = 1;i <= len;++i) dp[i] = 0;
		dp[0] = 1;
		ans = now = 0;
		for (int i = 1;i <= len;++i){
			//cout << i <<endl;
			if (ans + max_len < i) break;
			c = s[i] - 'a';
			now = nxt[now][c];
			for (int j = now;j;j = fail[j]){
				dp[i] |= dp[i - val[j]];
				if (dp[i]) break;
			}
			if (dp[i]) ans = i;
		}
		return ans;
	}
}
inline void write(int x) {
	static int sta[35];
	int top = 0;
	do {
		sta[top++] = x % 10,x /= 10;
	} while (x);
	while (top) putchar(sta[--top] + 48);
}
int n,m;
int main(){
	using namespace ac;
	cin >> n >> m;
	while (n--){
		scanf("%s",s + 1);
		insert(strlen(s + 1));
	}
	//AC[0].fail = 0;
	bfs();
	while (m--){
		scanf("%s",s + 1);
		write(query(strlen(s + 1)));
		puts("");
	}
}

就AC了。

为什么?

2024/7/16 17:06
加载中...