http://acm.hdu.edu.cn/showproblem.php?pid=1251
思路: 第一次 做字典树,捞的一匹 , 理解了半天还是懵懵懂懂,裸字典树板子,注意要理解,很烦 ,,,,
放几个 板子 都是大佬的博客
https://blog.youkuaiyun.com/king_cannon_fodder/article/details/77175620
https://blog.youkuaiyun.com/u013588639/article/details/38406453
小弱鸡 看不懂指针的写法,一直找数组。。。。。。。。
代码:弱鸡 解释不全 EMMMMMMM....
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll;
struct Trie{
int ch[1000005][26];//建立整棵树
ll val[1000005];//某个串出现的次数
ll sz;//表示节点的代号
Trie(){sz = 1;memset(ch[0], 0, sizeof(ch[0]));}
int idx(char c){ return c - 'a';}void Insert(char *s){
int len = strlen(s);
ll u = 0;
for(int i = 0; i < len; i++){
int c = idx(s[i]);//将字母转化为数字
if(!ch[u][c]){//如果不存在的话 就要建立一个新的结点,节点的下标为sz这个 sz数组初始化为零
memset(ch[sz], 0 ,sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];//往下走
val[u]++;//到u这个字母时 该字串出现的次数
}
}
int query(char *s){//查字串
int u = 0,c;
for(int i = 0; i< strlen(s); i++){
c = idx(s[i]);
if(!ch[u][c]){//没有直接跳出
return 0;
}
u = ch[u][c];//找到最后一个字母和他的下标
}
return val[u];//返回次数
}
};
Trie T;
int main()
{
// T.clear();
char s1[15];
while(gets(s1)){
if(s1[0] == '\0')break;
else{
T.Insert(s1);
}
}while(~scanf("%s",s1)){
if(s1[0] == '\0') break;
ll ans;
ans = T.query(s1);
printf("%lld\n",ans);
}
}