链接:点击打开链接
解题思路:以类似链表的形式构造出一个字典树,每次将一个字符串加入树中,对该串个每个前缀进行判断(自然没出现过要开辟空间新建节点),然后对该节点维护的sum++就可以了。会建树查询应该也没问题吧~
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdlib>
using namespace std;
int n;
struct hui{
hui * a[30];
int sum;
};
hui root;
void zidiantree(char str[]){
int id;
hui *p=&root;
for(int i=0;i<strlen(str);i++){
id=str[i]-'a';
if(p->a[id]==NULL){
hui *q=(hui *)malloc(sizeof(hui));
memset(q->a,0,sizeof(q->a));
q->sum=1;
p->a[id]=q;
p=q;
}
else{
p->a[id]->sum++;
p=p->a[id];
}
}
}
int treecha(char str[]){
int id;
hui *p=&root;
for(int i=0;i<strlen(str);i++){
id=str[i]-'a';
if(p->a[id]==NULL)
return 0;
p=p->a[id];
}
return p->sum;
}
int main(){
char str[1000];
int i,j,n,m,k;
memset(root.a,0,sizeof(root.a));
memset(str,0,sizeof(str));
while(gets(str)&&str[0]!='\0'){
zidiantree(str);
}
while(gets(str)){
k=treecha(str);
cout<<k<<endl;
}
return 0;
}