逆序单词 HIhoCoder 1366 字典序

题意

在英文中有很多逆序的单词,比如dog和god,evil和live等等。

现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词。

第1行:1个整数,N,表示单词数量。2≤N≤50,000。

第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母。保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye)。

输出第一行是个整数,表示单词表中的逆序单词的对数。

解题思路

这个是我看B站学习字典序上看到的题,基本是个模板题。详情看代码实现吧。

代码实现

字典树大体有两种实现方式,区分是从结点的建立上,一种是使用new分配空间建立,另一种是预先开辟一个数组。

下面是两种形式的代码。第二种运行比较快。

#include<bits/stdc++.h> //时间是453ms
using namespace std;
struct Node
{
Node *next[26]; //对应26个小写英文字母
int flag; //这个记录从根节点到现在这个结点组成的单词是不是存在的单词,如果有多个的话,可以记录个数。
Node()//构造函数
{
for(int i=0; i<26; i++)
next[i]=NULL;
flag=0;
}
}*root;//这个root是字典树的第一个结点,也就是树的根。 void insert(char *s) //插入操作
{
int len=strlen(s);
Node *now = root;
for(int i=len-1; i>=0; i--) //根据题目要求,这里使用逆序插入比较好。
{
int to=s[i]-'a';
if(now->next[to]==NULL) //如果没有子节点,就建立。
now->next[to]=new Node();
now=now->next[to];//然后进入到下一个单词的子节点。
}
now->flag++; //可能有多个单词
}
int fid(char *s)//查找函数
{
int len=strlen(s);
Node *now=root;
for(int i=0; i<len; i++)//这里就是正向查找了
{
int to=s[i]-'a';
if(now->next[to]==NULL)
return 0;
now=now->next[to];
}
return now->flag;//返回以这个结点为尾的单词的个数
}
void del(Node *rot) //因为使用的是new分配的空间,所以使用完毕需要进行删除。
{
for(int i=0; i<26; i++)
{
if(rot->next[i])
del(rot->next[i]);//递归形式的删除。
}
delete(rot);
}
int main()
{
int n, ans=0;
char op[20];
root = new Node();
scanf("%d",&n);
getchar();
for(int i=0; i<n; i++)
{
scanf("%s", op);
ans+=fid(op);
insert(op);
}
printf("%d\n", ans);
del(root);
return 0;
}
#include<bits/stdc++.h> //时间是242ms
using namespace std;
const int maxn=2e6+7;
int tree[maxn][27];
int flag[maxn];
int tot;
void insert(char *str)
{
int len=strlen(str);
int root=0;
for(int i=len-1; i>=0; i--)
{
int id=str[i]-'a';
if(!tree[root][id])
tree[root][id]=++tot; //类似于邻接链表的形式来建立
root=tree[root][id];
}
flag[root]++;
}
int find(char *str) //需要根据需要进行匹配
{
int len=strlen(str);
int root=0;
for(int i=0; i<len; i++)
{
int id=str[i]-'a';
if(!tree[root][id])
return 0;
root=tree[root][id];
}
return flag[root];
}
int main()
{
int n, ans=0;
char op[20];
scanf("%d",&n);
getchar();
for(int i=0; i<n; i++)
{
scanf("%s", op);
ans+=find(op);
insert(op);
}
printf("%d\n", ans);
return 0;
}

逆序单词 HIhoCoder 1366 字典树的更多相关文章

  1. HihoCoder1366 逆序单词(字典树)

    逆序单词 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每 ...

  2. TOJ3097: 单词后缀 (字典树 or map瞎搞)

    传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...

  3. Java实现 LeetCode 648 单词替换(字典树)

    648. 单词替换 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other( ...

  4. hiho一下 第197周 逆序单词

    1.set #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath&g ...

  5. hdu 1251:统计难题(字典树,经典题)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  6. Codeforces 633 C Spy Syndrome 2 字典树

    题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典 ...

  7. Trie 字典树

    字典树是哈希树的变种, 它采用公用前缀的方式来提高效率, 刚开始以为公用前缀, 空间会节省, 后来想想, 空间也不是节省, 因为每一个都有26个指针(这里假设都是小写字母的话), 不过他的时间复杂度是 ...

  8. [ACM] hdu 1251 统计难题 (字典树)

    统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单 ...

  9. 算法学习笔记(一)C++排序函数、映射技巧与字典树

    1.头文件algorithm中有函数sort()用于排序,参数为:排序起始地址,排序结束地址,排序规则(返回bool型)例如,要将array[] = {5,7,1,2,9}升序排列,则使用: bool ...

随机推荐

  1. LeetCode - 乘积最大子串

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子串(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: ...

  2. python爬虫系列之数据的存储(二):csv库的使用

    上一篇我们讲了怎么用 json格式保存数据,这一篇我们来看看如何用 csv模块进行数据读写. 一.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因 ...

  3. Flume的断点续传解决

    根据需求,首先定义以下3大要素 采集源,即source——监控文件内容更新 :  exec  ‘tail -F file’ 下沉目标,即sink——HDFS文件系统  :  hdfs sink Sou ...

  4. 在vi vim中使用正则表达式与 普通perl正则的区别?

    参考这篇文章很好 vim中的正则表达式常用的命令有种, 即搜索和替换 /: 搜索 :s 替换 在vim中的正则表达式和perl编程的正则表达式还是有区别的: 正则表达式中的内容包括: 字面字符... ...

  5. 七、SpringBoot项目集成JSP以及项目不同启动方式及访问路径配置

    1.创建JSP目录 在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图: 然后再改文件夹下面我们创建JSP文件: 大家在使用IDEA 的new菜单创建JSP ...

  6. 如何选择EDM电子邮件服务提供商

    选择一家好的EDM电子邮件服务商非常重要,因为这可以让我们的EDM营销事半功倍,同时可以达到更好的营销效果.下面博主为大家介绍一下选择标准. 一.服务好不好. 这点很重要,当然这里的服务包括售前和售后 ...

  7. EDM概念之A/B分类测试法

    相信很多情况下大家都会看到A/B分类测试法这个专业术语,下面博主简要介绍下什么是A/B分类测试法. 这里的A和B主要是指两种不同版本的电子邮件.一般来说,可以将用户分为同等数量的两组,一组发送A版本, ...

  8. 新年春节EDM邮件内容设计案例分享

    春节自古以来都是中国最重要的节日.随着中国的发展,中国的春节在世界上都已受到越来越多人的关注,有许多国家和地区都将春节定为法定假日.与此同时,许多品牌营销商也选择在这个时候为中国客户发送马年新年邮件, ...

  9. Python Module_os_操作系统

    目录 目录 前言 软件环境 os模块内建属性 osname 获取执行平台的类型 oslinesep 输出当前平台使用的行终止符 ossep 输出操作系统特定的路径分隔符 ospathsep 输出用于分 ...

  10. Unity Ray 射线

    射线:射线是3D世界一个向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射. 用途:射线范围比较广,多用于碰撞检测(如:子弹飞行是否击中目标).角色移动等. Ray是一个结 ...