[Ybt Advanced 2-4-1] 접두사 통계

접두사 통계

주제 링크 : ybt 효율적인 고급 2-4-1

이야기

많은 문자열이 있으며 쿼리가있을 때마다 주어진 문자열의 접두사가 몇 개나됩니다.

아이디어

이 질문은 Trie tree (심지어 약간의 템플릿)로 볼 수 있습니다. 그냥 평범한 빌드로 트리를 만드세요.
문의는 길이가 접두사가 될 때마다 길이에 따라 Trie 번호의 위치를 ​​실제로 밀어 넣을 수 있습니다. 그런 다음 답을 추가하십시오.

물론 우리는 더 이상 요청할 때 트리를 다시 만들 필요가 없으며이 가지가 없으면 그냥 끝낼 수 있습니다.

암호

#include<cstdio>
#include<cstring>

using namespace std;

struct Trie {
    
    
	char x;
	int son[301], end;
}trie[1000001];
int n, m, cn, now, KK, re;
char c[1000001];

void build() {
    
    //建Trie树
	now = 0;
	for (int i = 0; i < cn; i++) {
    
    
		if (!trie[now].son[c[i]]) {
    
    
			trie[now].son[c[i]] = ++KK;
			trie[now].x = c[i];
		}
		now = trie[now].son[c[i]];
	}
	trie[now].end++; 
}

int find() {
    
    
	now = 0;
	re = 0;
	for (int i = 0; i < cn; i++) {
    
    
		if (!trie[now].son[c[i]]) return re;
		
		now = trie[now].son[c[i]];
		re += trie[now].end;//一个一个前缀找
	}
	return re;
}

int main() {
    
    
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; i++) {
    
    
		scanf("%s", c);
		cn = strlen(c);
		
		build();
	}
	
	for (int i = 1; i <= m; i++) {
    
    
		scanf("%s", c);
		cn = strlen(c);
		
		printf("%d\n", find());
	}
	
	return 0;
}

추천

출처blog.csdn.net/weixin_43346722/article/details/112987371