T1 IMMEDIATE DECODABILITY poj 1056

题目大意:

一些数字串 求是否存在一个串是另一个串的前缀

思路:

对于所有串经过的点权+1 如果一个点的end被访问过或经过一个被标记为end的点 就存在

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 15100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,tr[][],T,ans,vis[MAXN],sz,end[MAXN];
char ch[];
void ins(char *c,int len)
{
int pos=;
for(int i=;i<len;i++)
{
if(!tr[pos][c[i]-'']) tr[pos][c[i]-'']=++sz;
pos=tr[pos][c[i]-''],vis[pos]++;
if(end[pos]) ans=;
}
if(vis[pos]>) ans=;end[pos]=;
}
int main()
{
while(scanf("%s",ch)!=EOF)
{
ans=sz=;memset(vis,,sizeof(vis));
memset(tr,,sizeof(tr));memset(end,,sizeof(end));
while(ch[]!=''){ins(ch,strlen(ch));scanf("%s",ch);}
if(!ans) printf("Set %d is immediately decodable\n",++T);
else printf("Set %d is not immediately decodable\n",++T);
}
}

T2 L语言 bzoj 1212

题目大意:

给字典 求一个字符串能被字典解释的最长前缀

思路:

因为字典内的单词都很短

可以对每一个模式串的位置向后匹配递推

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 1000100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,tr[][],sz,end[MAXN],f[MAXN];
char ch[],s[MAXN];
void ins(char *c,int len)
{
int pos=;
for(int i=;i<len;i++)
{
if(!tr[pos][c[i]-'a']) tr[pos][c[i]-'a']=++sz;
pos=tr[pos][c[i]-'a'];
}
end[pos]=;
}
int query(char *c,int len)
{
int pos=,res=,k;
if(tr[pos][c[]-'a']) f[]=;
else return ;
for(int i=;i<len;i++)
{
if(!f[i]) continue;
pos=tr[pos][c[i]-'a'],k=;
while(pos)
{
if(end[pos]) f[i+k+]=,res=max(res,min(i+k+,len));
pos=tr[pos][c[i+k+]-'a'],k++;
}
}
return res;
}
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++) {scanf("%s",ch);ins(ch,strlen(ch));}
while(m--)
{
scanf("%s",s);memset(f,,sizeof(f));
printf("%d\n",query(s,strlen(s)));
}
}

T3 秘密信息 bzoj 1590

题目大意:

n个信息 m个密码 对每个密码求有多少信息与它匹配 也就是说,有多少信息和这条密码有着相同的前缀

思路:

加到字典序里记一下经过的end标记和这个密码的end位置有多少个信息经过

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 500100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,tr[MAXN][],sz,end[MAXN],s[MAXN];
void ins(int len)
{
int pos=;
for(int i=,k;i<len;i++)
{
k=read();
if(!tr[pos][k]) tr[pos][k]=++sz;
pos=tr[pos][k],s[pos]++;
}
end[pos]++;
}
int query(int len)
{
int pos=,res=,f=;
for(int i=,k;i<len;i++)
{
k=read();
if(f) continue;pos=tr[pos][k];
if(!pos) f=;
if(i!=len-) res+=end[pos];
}
if(!f) res+=s[pos];
return res;
}
int main()
{
n=read(),m=read();int k;
for(int i=;i<=n;i++) {k=read();ins(k);}
while(m--) {k=read();printf("%d\n",query(k));}
}

T4 背单词 bzoj 4567

题目大意:

放n个单词,放每个单词之前如果没有把这个单词的后缀都先放上去则代价为n*n)

每个单词的代价等于这个单词的位置减去上一个出现的这个单词的后缀的位置(若没有后缀则代价为它的位置)

求最少的代价

思路:

首先肯定要把所有单词的后缀都加入否则代价太大

然后倒着把单词加入建trie树 对于所有end节点向上最近的end连边

可以得到一个树 每个树按照size从小到大遍历

答案就是所有节点的序号-父亲的序号

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 500100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,tr[MAXN][],tot,end[MAXN],st[MAXN],top;
ll ans;
char ch[MAXN],s[MAXN];
int fst[MAXN],nxt[MAXN],to[MAXN],cnt,fa[MAXN],sz[MAXN];
void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
void ins(char *c,int len)
{
int pos=,tmp=;
for(int i=len-;i>=;i--)
{
if(!tr[pos][c[i]-'a']) tr[pos][c[i]-'a']=++tot;
pos=tr[pos][c[i]-'a'];
}
end[pos]=;
}
void dfs(int x,int anc)
{
if(end[x]) {add(x,anc);add(anc,x);fa[x]=anc,anc=x;}
for(int i=;i<;i++)
if(tr[x][i]) dfs(tr[x][i],anc);
}
void build(int x)
{
sz[x]=;
for(int i=fst[x];i;i=nxt[i])
if(to[i]!=fa[x]) {build(to[i]);sz[x]+=sz[to[i]];}
}
bool cmp(int x,int y) {return sz[x]<sz[y];}
void dfs(int x)
{
int l=top+,r;ll s=;
for(int i=fst[x];i;i=nxt[i]) if(to[i]!=fa[x])st[++top]=to[i];
sort(st+l,st+top+,cmp);r=top;
for(int i=l;i<=r;i++) {ans+=s,s+=sz[st[i]];dfs(st[i]);}
}
int main()
{
n=read();
for(int i=;i<=n;i++) {scanf("%s",ch);ins(ch,strlen(ch));}
dfs(,);build();dfs();printf("%lld\n",ans);
}

T5 The xor-longest Path bzoj 1954

题解链接  唯一的区别是poj 从0开始

蓝书2.3 Trie字典树的更多相关文章

  1. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  2. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  3. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  4. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  5. 817E. Choosing The Commander trie字典树

    LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...

  6. C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  7. 数据结构 -- Trie字典树

    简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质:   1.  根节 ...

  8. 踹树(Trie 字典树)

    Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...

  9. Trie(字典树)解析及其在编程竞赛中的典型应用举例

    摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...

随机推荐

  1. Xshell连接Centos7.5和yum

    目 录 第1章 Centos7 IP地址的配置    1 1.1 第一种配置ip方法(nmtui)    1 1.2 第二种 修改网卡配置文件    5 1.2.1 使用cat查看配置文件    5 ...

  2. Nginx基础篇(2)- Nginx基本配置文件和变量详解

    Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...

  3. python爬虫学习,使用requests库来实现模拟登录4399小游戏网站。

    1.首先分析请求,打开4399网站. 右键检查元素或者F12打开开发者工具.然后找到network选项, 这里最好勾选perserve log 选项,用来保存请求日志.这时我们来先用我们的账号密码登陆 ...

  4. 集训第五周 动态规划 K题 背包

    K - 背包 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  5. 全文搜索(A-3)-用户建模

    用户模型可以分为静态模型.动态模型.混合推荐用户模型. 静态模型往往通过显式方式收集用户偏好信息: 动态模型通过隐式方式收集用户偏好信息: 基于内容的用户系统的推荐模型: 关键字匹配,空间向量模型 协 ...

  6. Spring Boot多数据源连接8小时后断开的问题解决(MySQL)

    这个问题涉及的方面很多,需要一步步去排查,可能环境有问题,数据库有问题,但是网上最多的应该是如下的方式去解决. 以单个数据源为主,多个数据源基本方法一致. 1.MySQL 5版本之前可以通过在URL后 ...

  7. 携程Apollo(阿波罗)配置中心的Java样例客户端启动和调试

    参考:https://github.com/ctripcorp/apollo/wiki/Apollo%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97#23-java%E6%A0 ...

  8. php配置(php7.3)

    [PHP] ;;;;;;;;;;;;;;;;;;; ; About php.ini ; ;;;;;;;;;;;;;;;;;;; ; PHP's initialization file, general ...

  9. openstack setup demo Compute service

    本文包含以下部分 Compute service overview Install and configure controller node Prerequisites Install and co ...

  10. Spring 加载类路径外的资源文件

    原文:http://blog.csdn.net/gaofuqi/article/details/46417259 <bean id="propertyConfigurer" ...