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.是否被其他序列包含 刚开始 ...
随机推荐
- css3背景渐变色代码
从上到下 #grad { background: -webkit-linear-gradient(red, blue); background: -o-linear-gradient(red, b ...
- 将MongoDB服务器设置成Windows启动服务(win10)
如题,这个问题也百度了很久,百度还是挺给力的,但是都没能解决问题,后来在大神(原谅我不知道大神叫什么)的指导下,终于设置成功,特分享下设置过程.. MongoDB设置数据库我就不说了...额..算了, ...
- [Windows Server 2003] IIS自带FTP安装及配置方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:IIS6.0自 ...
- Linux 查询PID和端口号
https://www.cnblogs.com/understander/p/5546458.html
- 【sqli-labs】 less48 GET -Error based -Blind -Numeric -Order By Clause(GET型基于盲注的整型Order By从句注入)
图片还是47...访问的的确是48 这个是基于bool的盲注 http://192.168.136.128/sqli-labs-master/Less-48/?sort=1 and sleep(0.1 ...
- HDU_1542_线段树【扫描线】
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- CAD绘一个文字自动剧中的标注 (com接口)
主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...
- 2.2sklearn.preprocessing.PolynomialFeatures生成交叉特征
sklearn.preprocessing.PolynomialFeatures原文 多项式生成函数:sklearn.preprocessing.PolynomialFeatures(degree=2 ...
- Flask - 请求处理流程和上下文源码分析
目录 Flask - 请求处理流程和上下文 WSGI Flask的上下文对象及源码解析 0. 请求入口 1.请求上下文对象的创建 2. 将请求上下文和应用上下文入栈 3.根据请求的URl执行响应的视图 ...
- BUAA_OO_博客作业三
1 JML语言总结 1.1 JML语言的理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言(Behavi ...