前缀统计(trie)

前缀统计

1010A 前缀统计
​ 给定 N 个字符串 S1,S2…SN,接下来进行 M 次询问,每次询问给定一个字符串 T,求 S1−SN中有多少个字符串是 T 的前缀。输入字符串的总长度不超过 106,仅包含小写字母。

Trie模板题,把插入的时候的结尾bool数组改成计数器

int n,m;
int trie[maxn][30],tot=1;
int en[maxn];
char sn[maxn];
void inser(char *s){
    
    //trie插入
    int ch,len=strlen(s),p=1;
    for(int i=0;i<len;i++){
    
    
        ch=s[i]-'a';
        if(trie[p][ch]==0)trie[p][ch]=++tot;
        p=trie[p][ch];
    }
    en[p]++;
}
int sear(char *s){
    
    //检索字符串是否存在
    int len=strlen(s),p=1,ch,sum=0;
    for(int i=0;i<len;i++){
    
    
        ch=s[i]-'a';
        p=trie[p][s[i]-'a'];
        if(p==0)break;
        sum+=en[p];
    }
    return sum;
}
int main(){
    
    
    sci(n);sci(m);
    LL ans=0;
    rep(i,1,n){
    
    
        scanf("%s",sn);
        inser(sn);
    }
    rep(i,1,m){
    
    
        scanf("%s",sn);
        cout<<sear(sn)<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44986601/article/details/105629281