样例不过0分求条
查看原帖
样例不过0分求条
735696
Mcqueen1210楼主2025/7/24 16:52

rt,记搜+trie

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll M=500005;
ll pb(char c)
{
	ll p;
	switch(c)
	{
		case 'A':p=0;break;
		case 'C':p=1;break;
		case 'T':p=2;break;
		case 'G':p=3;break;
		case '*':p=4;break;
		case '?':p=5;break;
	}
	return p;
}
struct trie
{
	ll t[M][4],cnt,real[M];
	void insert(string s,int l)
	{
		ll p=0;
		for(int i=0;i<l;i++)
		{
			ll c=pb(s[i]);
			if(!t[p][c]) t[p][c]=++cnt;
			p=t[p][c];
		}
		real[p]++;
	}
}t;
string vs,x;
ll n,m,ans;
bitset<1005>f[M];
void dfs(ll k,ll p)
{
	if(k==m+1)
	{
		ans+=t.real[p];
		t.real[p]=0;
		return;
	}
	if(f[k][p])
	{
		return;
	}
	f[k][p]=1;
	ll x=pb(vs[k]);
	if(x>=0&&x<=3)
	{
		if(t.t[p][x])
		{
			dfs(k+1,t.t[p][x]);
		}
	}
	else if(x==4)
	{
		for(int i=0;i<4;i++)
		{
			if(t.t[p][i])
			{
				dfs(k+1,t.t[p][i]);
			}
		}
	}
	else
	{
		dfs(k+1,p);
		for(int i=0;i<4;i++)
		{
			if(t.t[p][i])
			{
				dfs(k+1,t.t[p][i]);
				dfs(k,t.t[p][i]);
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>vs;
	m=vs.size();
	vs=' '+vs;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		t.insert(x,x.size());
	}
	dfs(1,0);
	cout<<n-ans;
	return 0;
}
2025/7/24 16:52
加载中...