hdu 2846(字典树)
Repository
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 5048 Accepted Submission(s): 1739
you go shopping, you can search in repository for avalible merchandises
by the computers and internet. First you give the search system a name
about something, then the system responds with the results. Now you are
given a lot merchandise names in repository and some queries, and
required to simulate the process.
is only one case. First there is an integer P
(1<=P<=10000)representing the number of the merchanidse names in
the repository. The next P lines each contain a string (it's length
isn't beyond 20,and all the letters are lowercase).Then there is an
integer Q(1<=Q<=100000) representing the number of the queries.
The next Q lines each contains a string(the same limitation as foregoing
descriptions) as the searching condition.
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cstdlib>
#include<string>
#define eps 0.000000001
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
struct tire{
int id,num;
tire *next[];
};
tire *root;
void insert(char *s,int k){
tire *p,*q;
p=root;
int len=strlen(s);
for(int i=;i<len;i++){
//cout<<3<<endl;
int t=s[i]-'a';
if(p->next[t]==NULL){
q=(tire *)malloc(sizeof(tire));
for(int j=;j<;j++)q->next[j]=NULL;
q->num=;
q->id=-;
p->next[t]=q;
}
p=p->next[t];
if(p->id!=k){
p->id=k;
p->num++;
}
}
}
int find(char *s){
tire *p=root;
int len=strlen(s);
for(int i=;i<len;i++){
int t=s[i]-'a';
if(p->next[t]==NULL)return ;
else
p=p->next[t];
}
return p->num;
}
int main(){
int m,n;
char str[];
root=(tire *)malloc(sizeof(tire));
for(int i=;i<;i++)root->next[i]=NULL;
root->id=-;
root->num=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",str);
int len=strlen(str);
for(int j=;j<len;j++){
//cout<<1<<endl;
insert(str+j,i);//cout<<2<<endl;
}
}
scanf("%d",&m);
while(m--){
scanf("%s",str);
cout<<find(str)<<endl;
}
}
接下来是一个静态的字典树(节省内存) c++ g++都可以过
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cstdlib>
#include<string>
#define maxnode 500000
#define sigma_size 30
#define eps 0.000000001
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
int ch[maxnode][sigma_size];
int val[maxnode];
int flag[maxnode];
int sz;
void init(){
memset(ch[],,sizeof(ch[]));
sz=;
}
int idx(char c){
return c-'a';
}
void insert(char *s,int k){
int u=;
int len=strlen(s);
for(int i=;i<len;i++){
int c=idx(s[i]);
if(ch[u][c]==){
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
ch[u][c]=sz++;
}
u=ch[u][c];
if(flag[u]!=k){
val[u]++;
flag[u]=k;
}
}
}
int find(char *s){
int u=;
int len=strlen(s);
for(int i=;i<len;i++){
int c=idx(s[i]);
if(ch[u][c]==)return ;
u=ch[u][c];
}
return val[u];
}
int main(){
int m,n;
init();
memset(flag,-,sizeof(flag));
//for(int i=0;i<10;i++)cout<<flag[i]<<" ";
char str[];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",str);
int len=strlen(str);
for(int j=;j<len;j++){
//cout<<1<<endl;
insert(str+j,i);//cout<<2<<endl;
}
}
scanf("%d",&m);
while(m--){
scanf("%s",str);
cout<<find(str)<<endl;
}
}
hdu 2846(字典树)的更多相关文章
- Repository HDU - 2846 字典树
题意:给出很多很多很多很多个 单词 类似搜索引擎一下 输入一个单词 判断有一个字符串包含这个单词 思路:字典树变体,把每个单词的后缀都扔字典树里面,这里要注意dd是一个单词 但是把d 和dd都放字典树 ...
- hdu 2846 字典树变形
mark: 题目有字串匹配的过程 有两点 1.为了高效的匹配子串 可以把所有的子串都预处理进去 然后字典树计数就放在最后面 2.在同一个母串处理自串的时候 会有重复的时候 比如abab 这里去重用个 ...
- HDU 5687 字典树插入查找删除
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...
- HDU 5384 字典树、AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...
- hdu 2112(字典树+最短路)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 2072(字典树模板,set,map均可做)
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072 lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词 ...
- Chip Factory HDU - 5536 字典树(删除节点|增加节点)
题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 ("^&qu ...
- hdu 1251 字典树的应用
这道题看了大神的模板,直接用字典树提交的会爆内存,用stl 里的map有简单有快 #include <iostream> #include <map> #include < ...
- hdu 2896 字典树解法
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> ...
- Phone List HDU - 1671 字典树
题意:给出一堆一组一组的数字 判断有没有哪一个是另外一个的前缀 思路:字典树 插入的同时进行判断 不过 当处理一组数字的时候 需要考虑的有两点1.是否包含了其他的序列2.是否被其他序列包含 刚开始 ...
随机推荐
- Android项目实战_手机安全卫士splash界面
- 根据代码的类型组织包结构 1. 界面 com.hb.mobilesafe.activities 2. 服务 com.hb.mobilesafe.services 3. 业务逻辑 com.hb.mo ...
- UI开发模式对比:JSP、Android、Flex
前一篇文章分析了Java平台下不同类型WEB框架对开发模式的影响,多数Java领域的WEB框架都是聚焦于服务端MVC的实现,这些框架对View的支持,通常是基于标准的JSP或类似JSP的模板技术如Fr ...
- [ Java ] [ UT ] [ Mock ] [ JUnit ] 單元測試的撰寫
最近新的專案用到很多的單元測試,對於單元測試有多了一歇的了解. 先寫下大綱,後面分篇寫出總結心得. 1. 單元測試要隔離對外部的關聯 2. Mock, spy 的用法時機差異 3. JUnit 4, ...
- 开发日记(项目中SQL查询的优化)
今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME) ...
- ddrmenu
<%@ Register TagPrefix="dnn" TagName="MENU" Src="~/DesktopModules/DDRMen ...
- Centos永久路由添加教程
Centos 永久路由添加,一张图看懂全部 blog地址:http://www.cnblogs.com/caoguo
- mongodb分片集群安装教程
mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...
- Zabbix 客户端安装教程(第二篇)
Zabbix 客户端安装教程 blog地址:http://www.cnblogs.com/caoguo [root@localhost ~]# yum install -y gcc make [roo ...
- OSI七层参考模型每一层都有哪些协议
OSI七层参考模型每一层都有哪些协议 第七层应用层 协议:DHCP • DNS • FTP • Gopher • HTTP • IMAP4 • IRC • NNTP • XMPP • POP3 • S ...
- php ip伪装访问
打算做个采集,无记录下来备用 php的curl搞定ip伪装来采集内容.以前写过一段代码采集一个数据来处理.由于数据量过大,同一ip采集.经常被限制,或者列为黑名单. 写了段代码伪装ip,原理是,客 ...