hdu1251

链接:点击打开链接

题意:一个空行前的为字典,空行后的为查找的对象,问以空行后的单词为前缀的单词个数有几个

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int str[500005][30],sum[500005];
int root;
void in(char *s){
    int u=0;
    for(;*s;s++){
        if(!str[u][*s-'a'])
        str[u][*s-'a']=root++;
        u=str[u][*s-'a'];
        sum[u]++;                   //与普通的字典树查找的区别就是另开一个数组记录重复的个数
    }
}
int fi(char *s){
    int u=0;
    int i,len;
    i=0;
    len=strlen(s);
    for(i=0;i<len;i++){
        if(!str[u][s[i]-'a'])
        return 0;
        u=str[u][s[i]-'a'];
        if(i==len-1)
        return sum[u];
    }
}                                   //字典树模板
int main(){                         //字典树用静态写的很少,而且数组大小不好掌握,但我认为相
    char s[15];                     //比于动态做法更容易理解,也更加容易实现,希望能够帮到一些
    int sign,cur;                   //用着静态写法并且正在遇到困难的人
    sign=0;cur=root=1;
    memset(str,0,sizeof(str));
    memset(sum,0,sizeof(sum));
    while(gets(s),strlen(s)>0){
    in(s);
//    for(int i=0;i<10;i++){
//        for(int j=0;j<10;j++)
//        cout<<str[i][j];
//        cout<<endl;
//    }
//    for(int k=0;k<10;k++)
//    cout<<sum[k]<<" ";
//    cout<<endl;
    }
    while(gets(s)){                 //与hdu1671有些相似,不会的可以先看那题
    printf("%d\n",fi(s));           //http://blog.csdn.net/stay_accept/article/details/47425161
    }
    return 0;
}

你可能感兴趣的:(hdu1251)