「 「 「字符串算法 」 」 」第 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 我