【Ybt OJ】[字符串算法 第4章] 字典树Trie树

本文详细介绍了字典树(Trie树)在字符串算法中的应用,包括前缀统计、最大异或对、最长异或路径等例题的分析和解题思路。通过贪心策略证明了在某些问题中Trie树的优势,并提供了相关代码实现。
摘要由CSDN通过智能技术生成

「 「 字符串算法 」 」 4 4 4章 字典树
目录:

A.前缀统计
B.最大异或对
C.最长异或路径
D.阅读理解

A . A. A. 例题 1 1 1 前缀统计

在这里插入图片描述

分析:

一道 T r i e Trie Trie模板题 需要支持插入 ( i n s e r t ) (insert) (insert)查询 ( q u e r y ) (query) (query)两个操作就好了

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue> 
#pragma GCC optimize(2)
#define reg register 
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const int N=1e6+5;
struct Trie{
   
	int son[305],end;
	char ch;
}trie[N];
int n,m,lenx,p,tot,ret;
char x[N];
void insert(char a[])  //往字典树加入一个字符串
{
   
	lenx=strlen(a);
	p=0;
	for(int i=0;i<lenx;i++)
	{
   
		if(!trie[p].son[x[i]])
		{
   
			trie[p].son[x[i]]=++tot;
			trie[p].ch=x[i];
		}
		p=trie[p].son[x[i]];
	}
	trie[p].end++;
}
int search(char a[])  //查询
{
   
	lenx=strlen(a);
	p=0;ret=0;
	for(int i=0;i<lenx;i++)
	{
   
		if(!trie[p].son[x[i]]) return ret;
		p=trie[p].son[x[i]];
		ret+=trie[p].end;
	}
	return ret;
}
int main(){
   
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
   
		scanf("%s",x);
		insert(x);
	}
	for(int i=1;i<=m;i++)
	{
   	
		scanf("%s",x);
		printf("%d\n",search(x));
	}
	return 0;
}

B . B. B. 例题 2 2 2 最大异或对

在这里插入图片描述

分析:

第一眼看可以暴力枚举 然后把优化开到极致还是会 T L E TLE TLE 1040 m s ( 1040ms( 1040ms(其实再卡卡就过了 ) ) )
这样看到 x o r xor xor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值