Trie树16分求调
查看原帖
Trie树16分求调
1113503
xixiyan楼主2024/8/7 06:54

P8306,rt

考虑输入

1
1 1
a a

代码会输出0,下附代码

#include <bits/stdc++.h>
using namespace std;
int T,q,n,t[3000005][65],cnt[3000005],tot;

int getnum(char x){
    if(x>='A'&&x<='Z') return x-'A';
    else if(x>='a'&&x<='z') return x-'a'+26;
    else return x-'0'+52;
} 


void insert(string str){
	
    int p=0,len=str.length();
    
    for(int i=0;i<len;i++){
    	
        int c=getnum(str[i]);
        
        if(!t[p][c]){
        	
        	t[p][c]=tot;
        	
			tot++;
			
		}
        p=t[p][c]; 
        
		cnt[p]++;
    }
}

int find(string str){
	
    int p=0,len=str.length();
    
    for(int i=0;i<len;i++){
    	
        int c=getnum(str[i]);
        
        if(t[p][c]==0) return 0;
        
        p=t[p][c];
    }
    
    return cnt[p];
}

int main(){
	cin>>T;
	while(T--){
		cin>>n>>q;
		string s;
		for(int i=1;i<=n;i++){
			string s;
            cin>>s;
            insert(s);
        }
		for(int i=1;i<=q;i++){
            cin>>s;
            cout<<find(s)<<'\n';
        }
        for(int i=0;i<=tot;i++){
        	for(int j=0;j<65;j++){
        		t[i][j]=0;
			}
		}
		for(int i=0;i<=tot;i++){
			cnt[i]=0;
		}
        tot=0;
	}
	return 0;
}

2024/8/7 06:54
加载中...