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. 零基础入门学习Python(7)--了不起的分支和循环1

    前言 我们今天的主题,是了不起的分支和循环,为什么不说c语言,Python了不起,而对分支和循环这两个知识点那么崇拜呢? 我们之前的几节课里也接触到了分支和循环,大家思考一下,如果我们的程序没有分支和 ...

  2. 集训第六周 矩阵快速幂 K题

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

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

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

  4. [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)

    传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的. 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long ...

  5. python-gzip解压缩(实验吧SOS)

    本题看着很简单,就是在弄出来的老是乱码,看了pcat的wp还是不行,下面的评论说可能是python版本问题,改版本太麻烦,试了一下先gzip解压,得到的文件在打开就不是乱码了,代码如下: # -*- ...

  6. K-th Number POJ - 2104 划分树

    K-th Number You are working for Macrohard company in data structures department. After failing your ...

  7. bzoj1834 网络扩容 网络流

    好久没写题解了啊··· 题目大意: 给你一幅n个点的网络,先求出其1到n的最大流,每条弧还会有个属性\(cost_i\),表示没扩容一个单位的费用,现在我们要求的就是扩容K个单位的最小费用 思路: 这 ...

  8. cogs——619. [金陵中学2007] 传话

    619. [金陵中学2007] 传话 ★★   输入文件:messagez.in   输出文件:messagez.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 兴趣小 ...

  9. windows 7中添加新硬件的两种方法(本地回环网卡)

    最近在windows7上使用VMwareWorkstation7玩一些实验,遇到需要配置不同网络的问题. 因为在windows2003server上习惯使用要本地回环网卡了,那就想着在Windows7 ...

  10. 1064 - You have an error in your SQL syntax问题解决

    新建表sql语句例如以下,在navicat for mysql 中执行,报错. CREATE TABLE `t_article`( `bh` bigint(20) NOT NULL PRIMARY K ...