明明就是个简单的字典树,我不过就是想复习一下尼玛被自己坑死了T^T

把字符串分解那儿写错了,检查了半天没找到错误,然后以为被卡数组内存,难过的学习字典树的指针写法。。

发现还是不对,大半夜突然看到自己傻乎乎的错误顿时感觉好傻逼啊啊啊!!

字典树数组写法:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int flag[500005],count[500005],sz;
 4 int ch[500005][30];
 5 char s[25];
 6 void insert(char *s,int v)
 7 {
 8   int u=0,n=strlen(s),i,c;
 9   for (i=0;i<n;i++)
10   {
11     c=s[i]-'a';
12     if (!ch[u][c])
13     {
14       flag[++sz]=v;
15       count[sz]=1;
16       ch[u][c]=sz;
17     }
18     else if (flag[ch[u][c]]!=v)
19     {
20       count[ch[u][c]]++;
21       flag[ch[u][c]]=v;
22     }
23     u=ch[u][c];
24   }
25   return;
26 }
27 int find(char *s)
28 {
29   int i,u=0,len=strlen(s),c;
30   for (i=0;i<len;i++)
31   {
32     c=s[i]-'a';
33     if (!ch[u][c]) return 0;
34     u=ch[u][c];
35   }
36   return count[u];
37 }
38 int main()
39 {
40   int n,i,len,j;
41   while (~scanf("%d",&n))
42   {
43     sz=0;
44     memset(ch,0,sizeof(ch));
45     memset(count,0,sizeof(count));
46     for (i=1;i<=n;i++)
47     {
48       scanf("%s",s);
49       len=strlen(s);
50       for (j=0;j<len;j++)
51         insert(s+j,i);
52     }
53     scanf("%d",&n);
54     for (i=1;i<=n;i++)
55     {
56       scanf("%s",s);
57       printf("%d\n",find(s));
58     }
59   }
60   return 0;
61 }

View Code

指针写法:

 1 #include<stdio.h>
 2 #include<string.h>
 3 struct tree{
 4   struct tree *son[26];
 5   int count,flag;
 6 }*root;
 7 void insert(char *s,int v)
 8 {
 9   int len=strlen(s),i,j,c;
10   tree *cur=root,*next;
11   for (i=0;i<len;i++)
12   {
13     c=s[i]-'a';
14     if (cur->son[c]!=NULL) cur=cur->son[c];
15     else
16     {
17       next=new(tree);
18       for (j=0;j<26;j++)
19         next->son[j]=NULL;
20       next->count=0; next->flag=-1;
21       cur->son[c]=next;
22       cur=next;
23     }
24     if (cur->flag!=v)
25     {
26       cur->count++;
27       cur->flag=v;
28     }
29   }
30   return;
31 }
32 int find(char *s)
33 {
34   int i,len=strlen(s),c;
35   tree *cur=root;
36   for (i=0;i<len;i++)
37   {
38     c=s[i]-'a';
39     if (cur->son[c]==NULL) break;
40     cur=cur->son[c];
41   }
42   if (i<len) return 0;
43   return cur->count;
44 }
45 int main()
46 {
47   int n,i,len,j,m;
48   char s[25],st[25];
49   while (~scanf("%d",&n))
50   {
51     root=new(tree);
52     for (i=0;i<26;i++)
53       root->son[i]=NULL;
54     root->count=0; root->flag=-1;
55     for (i=1;i<=n;i++)
56     {
57       scanf("%s",s);
58       len=strlen(s);
59       for (j=0;s[j];j++)
60       {
61 //        memcpy(st,s+j,len-j);
62         insert(s+j,i);
63       }
64     }
65     scanf("%d",&m);
66     for (i=1;i<=m;i++)
67     {
68       scanf("%s",s);
69       printf("%d\n",find(s));
70     }
71   }
72   return 0;
73 }

View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846

转载于:https://www.cnblogs.com/xiao-xin/articles/4166245.html

hdu2846(2009多校第四场) 字典树相关推荐

  1. hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法

    二分查找n*logn*logn 比较容易理解 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm& ...

  2. hdu2847(2009多校第四场) 01串添加最少01使被k整除(暴力)

    要知道k倍数最多到2^20,然后暴力枚举On判断就好啦! 1 #include<stdio.h> 2 #include<string.h> 3 #include<algo ...

  3. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  4. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  5. 牛客多校第四场【B-Basic Gcd Problem】

    牛客多校第四场[B-Basic Gcd Problem] 题目链接:https://ac.nowcoder.com/acm/contest/5669/B 思路:先要理解公式,多看几个数据基本就会有点想 ...

  6. 2022 年牛客多校第四场补题记录

    A Task Computing 题意:给定长度为 nnn 的序列 {(wi,pi)}\{(w_i,p_i)\}{(wi​,pi​)},从中选出 mmm 项并重新排列得到子序列 {a1,a2,⋯,am ...

  7. hdu 4639 2013多校第四场 hehe Fibonacci 数列,组合计数,字符串处理

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4639 题目思路: 首先我们取出所有he这样的东西,考察连续的k个"he"串,通过找 ...

  8. 杭电多校第四场-H- K-th Closest Distance

    题目描述 You have an array: a1, a2, , an and you must answer for some queries. For each query, you are ...

  9. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

最新文章

  1. 行为模式之Iterator模式
  2. python 开运算_形态学去噪python(开运算,闭运算)
  3. 4万字长文ClickHouse应用实战-物化视图在微信的实践
  4. 最长上升子序列问题 (LIS)
  5. 【线上分享】RTC业务中的视频编解码引擎构建
  6. idea使用svn拉取项目代码_IntelliJ IDEA 14 拉取SVN maven 多模块项目 部署tomcat 详细图解!...
  7. 上一页下一页_多页PDF文件也能很快合为一页PDF文件?这个小技巧可以办到
  8. 刑事科学技术专业与计算机专业,辽宁警察学院刑事科学技术专业
  9. 数组 spark_spark——rdd常用的转化和行动操作
  10. 简单的c语言游戏编程打地鼠,少儿创意编程scratch初级游戏--打地鼠
  11. 苹果a7处理器_苹果历代cpu性能对比
  12. 李白的藏头诗鸿蒙圣安卓,李白藏头诗生成器
  13. vscode配置运行php项目完整版
  14. 国内TCP单边 加速 的 正确 做法
  15. 第九篇:万丈高楼平地起-驱动编程基础知识点
  16. git使用进阶(一)——工作区和log
  17. 刚生了宝宝后需要及时办理的6个证件
  18. 【工程数学】若干种解高次方程的算法
  19. (附源码)ssm高校实验室 毕业设计 800008
  20. 远程命令执行漏洞与远程代码执行漏洞33333

热门文章

  1. Angular 中得 scope 作用域梳理
  2. KOFLive Beta 下载情况及用户反馈
  3. 人生哲理名言六十六条
  4. java 向量上的坐标点_新高三知识点-点的平移公式
  5. 云计算技术 — 容灾备份技术
  6. FD.io/VPP — VPP 的实现原理解析
  7. Kong APIGW — Admin API 核心逻辑对象
  8. Python 编程系列
  9. DPI — nDPI — Overview
  10. Linux 操作系统原理 — 系统启动流程