[Ejemplo 1 del capítulo 9 de Ybtoj] Estadísticas de prefijos [Árbol de trie]

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Ideas para resolver problemas

Punto de conocimiento: árbol de diccionario

(Hmm, acabo de llegar al blog de Amway ^ _ ^)

Después de aprender las operaciones básicas del árbol de diccionarios, regrese y mire esta pregunta, ah, pregunta modelo. . .
Primero ponga NNAlmacene N cadenas en el árbol del diccionario, seav [p] v [p]v [ p ] representa el número de cadenas de caracteres que terminan con el nodo p en el árbol del diccionario.
Calcula la respuesta: atravesamos la cadena T, la respuesta es∑ x ϵ p [T] v [p] \ sum _ {x \ epsilon p [T]} v [p]x ε p [ T ]v [ p ]
p [T] p [T]p [ T ] representa el conjunto de números de nodo que T ha atravesado en el árbol del diccionario)


Código

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

char a[1000010],s[1000010];
int n,m,trie[1000010][30],v[1000010],lyx=1;

void insert(){
    
    //往字典树加入一个字符串
	int len=strlen(a+1),p=1,c=0;
	for(int i=1;i<=len;i++)
	{
    
    
		c=a[i]-'a'+1;
		if(!trie[p][c])
			trie[p][c]=++lyx;
		p=trie[p][c];
	}
	v[p]++;
//	cout<<v[p]<<" "<<p;
}

int get(){
    
    //查询
	int len=strlen(s+1),p=1,ans=0,c=0;
	for(int i=1;i<=len;i++)
	{
    
    
		c=s[i]-'a'+1;
		if(!trie[p][c])
			return ans;
		p=trie[p][c];
		ans+=v[p];
	}
	return ans;
}

int main() {
    
    
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%s",a+1);
		insert();
	}
	for(int i=1;i<=m;i++)
	{
    
    
		scanf("%s",s+1);
		printf("%d\n",get());
	}
}

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/114984485
Recomendado
Clasificación