P2922 [USACO08DEC]Secret Message G


字典树很好的一道题

这个题区别于一般的字典树前缀匹配在于

匹配的字符串可能比字典树上的长 也可能比字典树上的短

如果只是维护一个节点会被经过多少次肯定是没法解的

考虑再维护一个endd数组 表示以i节点为结尾的字符串数量

在查找的时候 比匹配字符串短的节点直接+endd数组即可

经过节点数sum就不行 因为我们只找匹配字符这一条线上的 但是sum是维护这个节点以下所有的

比匹配字符长的就可以直接加sum数组就好 这就回到了一般的字典树查找

但是要注意的是要减去endd{root} 因为这个会被加上两次 sum和endd都包含了

#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=5e5+5;
int n,m,cnt;
int tr[maxn][2],sum[maxn],endd[maxn]; 
void insert(string x);
int serach(string x);
int main(){
	cin>>m>>n;
	for(int i=0;i>bi;
		stringstream ss;//黑科技 很好用的
		for(int j=1;j<=bi;j++){
			int xi;cin>>xi;
			ss<>s;
		insert(s);
	}
	for(int i=1;i<=n;i++){
		int bi;cin>>bi;
		stringstream ss;
		for(int j=1;j<=bi;j++){
			int xi;cin>>xi;
			ss<>s;
		cout<