hdu 2072(字典树模板,set,map均可做)
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input 有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。 Output 每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。 Sample Input
you are my friend
#
Sample Output
4
set做法:
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
set<string>se;
int main()
{
string s;
while(getline(cin,s))
{
if(s[]=='#')
break;
string m;
se.clear();
int len=s.length();
// cout<<"len: "<<len<<endl;
for(int i=;i<len;i++)
{
// cout<<i<<" "<<s[i]<<endl;
if(s[i]>='a'&&s[i]<='z')
{
int j;
m.clear();
for(j=i;j<len&&s[j]>='a'&&s[j]<='z';j++)
{
m+=s[j];
}
i=j;
se.insert(m);
}
}
cout<<se.size()<<endl;
}
return ;
}
istringstream 做法(具体的我看不太懂,反正可以去掉空格):
#include<iostream>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
set<string>q;
int main()
{
string s;
while(getline(cin,s)){
if(s[]=='#')
break;
istringstream sss(s);
q.clear();
string ss;
while(sss>>ss){
q.insert(ss);
}
cout<<q.size()<<endl;
}
return ;
}
重点是字典树操作,由于对num数组的理解不透彻,写出了一堆BUG,自己实在不会变通啊。
这里的num数组记录的是:标记当前字符串结尾。比如qwe qw : 先是qwe可以得到: 1(q) 2(w) 3(e) 4
0 0 1
表示以e结尾的加入了
然后qw,k=2处,num=1,表示以w结尾的加入了。这就是两个单词。
上代码吧,开始看ac自动机了
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
#include<map>
const int maxn=1e4+;
int tr[maxn][];
int num[maxn];
string s;
string mid;
int k=;
int ans=;
int join()
{
int p=;
int len=mid.length();
int ok1=,ok2=;
for(int i=;i<len;i++)
{
int c=mid[i]-'a';
if(!tr[p][c])
{
tr[p][c]=k++;
}
p=tr[p][c];
}
if(!num[p]) //当前单词结尾没被标记,说明是一个新的单词。
{
num[p]=;
return ;
}
else
return ;
}
int main() //qq as a
{
while(getline(cin,s))
{
if(s[]=='#')
break;
k=;
ans=;
memset(tr,,sizeof(tr));
memset(num,,sizeof(num));
int len=s.length();
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
mid.clear();
int j;
for(j=i;j<len&&s[j]>='a'&&s[j]<='z';j++)
{
mid+=s[j];
}
i=j;
//
if(join()==)
{
ans++;
// cout<<mid<<" "<<ans<<endl;
}
}
}
cout<<ans<<endl;
}
return ;
}
hdu 2072(字典树模板,set,map均可做)的更多相关文章
- HDU - 1251 字典树模板题
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...
- hdu 1251 字典树模板题 ---多串 查找单词出现次数
这道题题目里没有给定数据范围 我开了2005 疯狂的WA 然后开了50000, A掉 我以为自己模板理解错 然后一天没吃饭,饿得胃疼还是想着把这题A掉再去吃,谁知竟然是这样的问题,,,呵呵~~~ ...
- 字典树模板题(统计难题 HDU - 1251)
https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...
- 字典树模板 HDU - 1251
题意: 给一些单词,换行键后,查找以后输入的单词作为前缀的话们在之前出现过几次. 思路: 字典树模板----像查字典的顺序一样 #include<string> #include<s ...
- hdu1521(字典树模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 中文题诶~ 思路: 字典树模板 代码1: 动态内存, 比较好理解一点, 不过速度略慢, ...
- CH 1601 - 前缀统计 - [字典树模板题]
题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...
- HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 Problem Descriptionlily的好朋友xiaoou333最近很空,他想了一件没有 ...
- 【统计难题】【HDU - 1251】【map打表或字典树】【字典树模板】
思路 题意:题目为中文题,这里不再过多阐述. 思路1:可以在读入单词表的过程中将单词分解,用map将它一 一记录 思路2:利用字典树,这个方法较快些,下面代码中会分别给出数组和结构体指针两种形式的字典 ...
- P1184 高手之在一起(字典树模板题,hash算法, map)
哎,唯一值得说明的是,这道题的输入有bug 先把字典树的算法模板放一下 #include<iostream> #include<cstring> using namespace ...
随机推荐
- 解析underscore中的debounce
先奉上源码 取自Underscore.js 1.9.1的debounce _.debounce = function(func, wait, immediate) { var timeout, res ...
- 安卓fragment transaction add方法报错
这个问题百度了很多能用的很少! 原来看的B站的视频教程比较老了参数不匹配!我记一下安卓studio3.1的方法 切换fragment 前都先要 FragmentManager manager=getS ...
- TCP/IP 三次握手,四次断开
TCP/IP 三次握手,四次断开 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷 本. 下面是TCP报文格式图: 图 ...
- Java Break 与 Continue
章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...
- CAN编写完分帧发送, 分帧接收,J1939位域型结构体心得
关于由多个不同的C文件构成的工程,我采用以下方法 以为400Hz数字电源程序为例 假设工程由以下文件组成 DC_Comm.c 主要完成串口通讯部分 DC_Config.c 主要完成时钟,外设 中断初始 ...
- Django——整体结构/MVT设计模式
MVT设计模式 Models 封装数据库,对数据进行增删改查; Views 进行业务逻辑的处理 Templates 进行前端展示 前端展示看到的是模板 --> 发起 ...
- 五十五、SAP中调用系统自带的函数
一.我们需要取一个月中的最后一天,代码如下 二.执行结果如下 三.以上为纯手打,错了好几次才改过来,还有一个办法就是系统自动生成,点击编辑->模式 四.输入需要调用的函数名字BKK_GET_MO ...
- Java 逆序打印链表
递归 package cookie; public class PrintListReversal { public void reversalOut(Node head) { if (head != ...
- SPOJ_DSUBSEQ Distinct Subsequences
统计一个只由大写字母构成的字符串的,子串数目,这里指的是子串不是子序列,可以不连续,请注意 然后我按照计数DP的思想,dp[i][j]表示长度为i的子串,最后一个字母为j 然后为了去重,每一次dp的时 ...
- 二、环境安装:yarn
依赖管理工具安装yarn 可参考前几篇文章 1.必须安装nodejs 注意:安装nodejs稳定版本 2.安装cnpm用cnpm替代npm 地址:http://npm.taobao.org/安装cnp ...