HDU1251:http://acm.hdu.edu.cn/showproblem.php?pid=1251

题目大意:求得以该字符串为前缀的数目,注意输入格式就行了。

 #include<stdio.h>
#include<string.h> char str[];
int trie[ * ][], cnt;
int sum[ * ]; void insert()
{
int len = strlen(str);
int rt = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - 'a';
if(!trie[rt][id])
trie[rt][id] = ++ cnt;
rt = trie[rt][id];
sum[rt] ++;
}
} int serach()
{
int len = strlen(str);
int rt = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - 'a';
if(!trie[rt][id])
return ;
rt = trie[rt][id];
}
return sum[rt];
} int main()
{
while(gets(str))
{
if(strlen(str) == )
break;
insert();
}
while(scanf("%s", str) != EOF)
{
printf("%d\n", serach());
}
return ;
}

HDU1251

HDU1305:http://acm.hdu.edu.cn/showproblem.php?pid=1305

题目大意:字符串之间互相不为前缀,则输出YES 否则NO

 #include<stdio.h>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a)) int trie[][], tot, k_rt[], cnt, sum[];
char str[]; void insert()
{
int len = strlen(str);
int root = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - '';
if(!trie[root][id])
trie[root][id] = ++ tot;
root = trie[root][id];
sum[root] ++;
}
k_rt[++ cnt] = root; //记录每个01字符串结束的位置
} void init()
{
mem(trie, );
mem(k_rt, );
mem(sum, );
cnt = , tot = ;
} int main()
{
int k = , flag;
while(scanf("%s", str) != EOF)
{
if(str[] != '')
insert();
else
{
flag = ;
for(int i = ; i <= cnt; i ++)
{
if(sum[k_rt[i]] >= )
{
flag = ;
break;
}
}
if(flag)
printf("Set %d is not immediately decodable\n", k ++);
else
printf("Set %d is immediately decodable\n", k ++);
init();
}
}
return ;
}

HDU1305

HDU1671:http://acm.hdu.edu.cn/showproblem.php?pid=1671

题目大意:与HDU1251是一样的

 #include<stdio.h>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a)) char str[];
int trie[][], tot, cnt, k_rt[], sum[]; void insert()
{
int len = strlen(str);
int root = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - '';
if(!trie[root][id])
trie[root][id] = ++ tot;
root = trie[root][id];
sum[root] ++;
}
k_rt[++ cnt] = root; //记录每个字符串的结束位置 ,通过结束位置上的出现次数判断是否是其他字符串的前缀
} void init()
{
mem(trie, );
mem(sum, );
mem(k_rt, );
tot = , cnt = ;
} int main()
{
int T, n, flag;
scanf("%d", &T);
while(T --)
{
init();
flag = ;
scanf("%d", &n);
getchar();
for(int i = ; i <= n; i ++)
{
scanf("%s", str);
insert();
}
for(int i = ; i <= cnt; i ++)
{
if(sum[k_rt[i]] >= )
{
flag = ;
break;
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return ;
}

HDU1671

模板

字典树建树模板:

 //建trie树
void insert()
{
int len = strlen(str);
int root = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - '';
if(!trie[root][id])
trie[root][id] = ++ tot;
root = trie[root][id];
sum[root] ++; //记录数目则需要
}
pos[++ cnt] = root; //记录每个字符串的结束位置 ,通
// 过结束位置上的出现次数判断是否是其他字符串的前缀
} // 若根据输入判断,则不需要这句话,查找输入的字符串最后一个位置的出现次数即可

建trie树

字典树查找模板:

 //trie树查找
int serach()//bool serach() , 该字符串为前缀的数目/是否存在以该字符串为前缀的字符串
{
int len = strlen(str);
int rt = ;
for(int i = ; i < len; i ++)
{
int id = str[i] - 'a';
if(!trie[rt][id])
return ;//return false;
rt = trie[rt][id];
}//达到字符串最后一个字符所在位置
return sum[rt]; // return true;
}

字典树查找

最新文章

  1. shell 带签名请求,yii 处理带签名的请求
  2. JAVA SSM 示例代码
  3. javascript语句——表达式语句、块语句、空语句和声明语句
  4. 乐易贵宾VIP教程:百度贴吧 - QQ部落 - QQ空间 Post实战系列视频课程
  5. 运行java的class文件方法详解
  6. ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件
  7. Inside The C++ Object Model - 03
  8. python数字图像处理(1):环境安装与配置
  9. C++Primer 第九章
  10. 下拉框上移、下移、添加、移除demo
  11. 深入浅出Java 重定向和请求转发的区别
  12. Laravel + Xdebug 时需要注意的问题
  13. Hbase结构简单、作法
  14. Python collections.defaultdict() 与 dict的使用和区别
  15. table 的部分使用,固定行,固定列等
  16. [PHP]flock文件IO锁的使用
  17. Spring基础之 反射(Reflection)
  18. Ubuntu 16.04 root环境变量不生效问题解决方案
  19. Sysmon + NXlog构建简单的windows安全监控
  20. Linux find、grep命令详细用法

热门文章

  1. 20190908 NOIP 模拟40
  2. c++继承子类构造函数问题
  3. 【Android】【踩坑日记】RecyclerView获取子View的正确姿势
  4. python 字符串(str)和列表(list)的互相转换
  5. JS 省市联动 ajax
  6. 影响mysql性能的因素
  7. SQL-W3School-基础:SQL 教程
  8. manifest节点
  9. python 通过 实例方法 名字的字符串调用方法
  10. JVM菜鸟进阶高手之路一[z]