90pts 极短代码玄关球跳
查看原帖
90pts 极短代码玄关球跳
546159
lihansheng1楼主2024/11/24 21:20
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e3+10;
int trie[maxn][6], cnt = 2;
char s[maxn];
int slen;
bool exi[maxn];
char swant[maxn];
int swantlen;
int Hash(char x) {
	if (x == 'A')return 0;
	if (x == 'C')return 1;
	if (x == 'G')return 2;
	if (x == 'T')return 3;
	else return 5;
}
void add(int Point, int Now) {
	if (Now == slen) {
		exi[Point] = true;
		return;
	}
	if (s[Now] == '*') {
		if (!trie[Point][4]) {
			trie[Point][4] = Point;
		}
		add(trie[Point][4], Now + 1);
	} else {
		if (!trie[Point][Hash(s[Now])]) {
			trie[Point][Hash(s[Now])] = cnt;
			cnt++;
		}
		add(trie[Point][Hash(s[Now])], Now + 1);
	}
	return ;
}
bool Dfs(int Point, int Now) {
	if (Point == 0)return false;
	if (Now == swantlen) {
		if (exi[Point])return true;
		return false;
	}
	if (Dfs(trie[Point][Hash(swant[Now])], Now + 1) || Dfs(trie[Point][5], Now + 1) || Dfs(trie[Point][4], Now + 1))return true;
	return false;
}
int n;
int main() {
	cin >> s;
	slen = strlen(s);
	add(1, 0);
	cin >> n;
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		cin >> swant;
		swantlen = strlen(swant);
		if (!Dfs(1, 0))ans++;
	}
	cout << ans;
}
2024/11/24 21:20
加载中...