关于CF UKE
  • 板块灌水区
  • 楼主LuckiestShawn
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/7 17:04
  • 上次更新2023/10/23 22:46:39
查看原帖
关于CF UKE
401479
LuckiestShawn楼主2023/3/7 17:04

CF852G 救救孩子吧

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct TRIE{
	struct AB{
		int p,deep;
	}p;
	queue <AB> que;
	int tree[550000][100],cp[550000],vist[550000];
	int tot;
	int hash(char ch)
	{
		if(ch=='?')
			return 0;
		return ch-'a'+1;
	}
	void init(char str[])
	{
		int p = 0,s;
		for(int i=0;i<strlen(str);i++)
		{
			s = hash(str[i]);
			if(tree[p][s]==0)
				tree[p][s] = ++tot;
			p = tree[p][s];
		}
		cp[p]++;
		return ;
	}
	int find(char str[],int k)
	{
		int p = 0,s;
		for(int i=0;i<strlen(str);i++)
		{
			s = hash(str[i]);
			if(s>5)
				continue;
			if(tree[p][s]==0)
				return 0;
			p = tree[p][s];
		}
		if(vist[p]==k)
			return 0;
		vist[p] = k;
		if(cp[p])
			return cp[p];
		return 0;
	} 
}T;
int ans;
int dfs(char str[],int kk)
{
	int k = 0,nul[10];
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='?')
			nul[++k] = i;
	if(k==0)
	{
		ans += T.find(str,kk);
	}
	else if(k==1)
	{
		for(int i='a';i<='e'+1;i++)
		{
			str[nul[k]] = i;
			ans += 	T.find(str,kk);
		}
	}
	else if(k==2)
	{
		for(int i='a';i<='e'+1;i++)
		{
			str[nul[1]] = i;
			for(int j='a';j<='e'+1;j++)
			{
				str[nul[2]] = j;
				ans += 	T.find(str,kk);
			}
		}
	}
	else if(k==3)
	{
		for(int l='a';l<='e'+1;l++)
		{
			str[nul[1]] = l;
			for(int i='a';i<='e'+1;i++)
			{
				str[nul[2]] = i;
				for(int j='a';j<='e'+1;j++)
				{
					str[nul[3]] = j;
					ans += 	T.find(str,kk);
				}
			}
		}
	}
	return ans;
}
char S[550];
int n,m;
int main()
{
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
		scanf("%s",S),
		T.init(S);
	for(int i=1;i<=m;i++)
	{
		scanf("%s",S);
		ans = 0;
		dfs(S,i);
		printf("%d\n",ans);
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
2023/3/7 17:04
加载中...