ZOJ1039

本文介绍了一种利用字典树结合深度优先搜索(DFS)进行字符串匹配和优化搜索效率的方法。通过实例演示了如何构建字典树并使用DFS进行特定字符串的查找和计数,特别适用于大规模字符串数据的快速检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典树+搜索时用dfs
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
int T,n,m;
char s[110];
vector<int>vt[9];
struct trie
{
	int cnt;
	trie * nxt[26];
};
trie * init(int num)
{
	trie * p=new trie;
	p->cnt=num;
	for(int i=0;i<26;i++)
		p->nxt[i]=NULL;
	return p;
}
struct node
{
	string s;
	int pro;
}tot[110];
void insert(trie *p,char *s,int num)
{
	int l=strlen(s);
	for(int i=0;i<l;i++)
	{
		int j=s[i]-'a';
		if(p->nxt[j]==NULL)
		{
			p->nxt[j]=init(num);
		}
		else
		{
			p->nxt[j]->cnt+=num;
		}
		p=p->nxt[j];
	}
}
void dfs(trie *p,char *s,int x,int l,string st)
{
	if(x!=0)
	{
		if(p->cnt>tot[x].pro)
		{
			tot[x].pro=p->cnt;
			tot[x].s=st;
		}
	}
	int j=s[x]-'0'-1;
	if(j==0)
		return;
	for(int i=0;i<vt[j].size();i++)
	{
		int y=vt[j][i];
		char c=y+'a';
		if(p->nxt[y]==NULL)
		continue;
		dfs(p->nxt[y],s,x+1,l,st+c);
	}
}
int main()
{
	int tt=0;
	for(int i=0;i<3;i++)
	vt[1].push_back(i);
	for(int i=3;i<6;i++)
	vt[2].push_back(i);
	for(int i=6;i<9;i++)
	vt[3].push_back(i);
	for(int i=9;i<12;i++)
	vt[4].push_back(i);
	for(int i=12;i<15;i++)
	vt[5].push_back(i);
	for(int i=15;i<19;i++)
	vt[6].push_back(i);
	for(int i=19;i<22;i++)
	vt[7].push_back(i);
	for(int i=22;i<26;i++)
	vt[8].push_back(i);
	scanf("%d",&T);
	while(T--)
	{		
		printf("Scenario #%d:\n",++tt);
		trie *p=init(1);
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
		{
			int c;
			scanf("%s%d",s,&c);
			insert(p,s,c);
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			for(int w=1;w<=105;w++)
				tot[w].pro=0;
			scanf("%s",s);
			int l=strlen(s);
			dfs(p,s,0,l,"");
			for(int i=1;i<l;i++)
			{
				if(tot[i].pro)
				cout<<tot[i].s<<endl;
				else
				cout<<"MANUALLY"<<endl;
			}
			cout<<endl;
		}
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值