【Trie】Immediate Decodability

【题目链接】:

https://loj.ac/problem/10052

【题意】:

就是给一些串,是否存在两个串是相同前缀的。

【题解】

模板题,不想解释了。

【代码】:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std ;
 5 typedef long long ll;
 6 const int N = 1e4;
 7 int Son[N][2];
 8 char str[N][20];
 9 int n,idx;
10 bool f,cnt[N];
11 void Insert(char s[]){
12     int p = 0 ;
13     for(int i=0;s[i];i++){
14         int t = s[i] - ‘0‘;
15         if( !Son[p][t] ) Son[p][t] = ++idx;
16         p = Son[p][t] ;
17     }
18     cnt[p] = true;
19 }
20 void Query(char s[]){
21     int p = 0;
22     for(int i=0;s[i+1];i++){
23         int t = s[i] - ‘0‘ ;
24         if( !Son[p][t] ) break;
25         p = Son[p][t];
26         if( cnt[p] ) f = true;
27     }
28 }
29 void Init(){
30     f = false;
31     idx = 0 ;
32     memset(Son,0,sizeof Son);
33     memset(cnt,false,sizeof cnt);
34 }
35 int main()
36 {
37     int kase = 0 ;
38     while(~scanf("%s",str[n])){
39         if( !strcmp( str[n],"9") ){
40             //printf("######### %d ######### \n",n);
41             Init();
42             for(int i=0;i<n;i++){
43                 Insert(str[i]);
44             }
45             for(int i=0;i<n;i++){
46                 Query(str[i]);
47             }
48             n = 0;
49             printf("Set %d is",++kase);
50             puts(!f?" immediately decodable":" not immediately decodable");
51         }else{
52             n ++ ;
53         }
54     }
55     return 0;
56 }

原文地址:https://www.cnblogs.com/Osea/p/11361508.html

时间: 2024-10-09 04:38:23

【Trie】Immediate Decodability的相关文章

【Trie】【cogs647】有道搜索框

647. [Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示: 现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词. [输入文件] 第一行是一个正整数 N ,表示词表中有

【Trie】背单词

参考博客: https://www.luogu.org/problemnew/solution/P3294 https://blog.csdn.net/VictoryCzt/article/details/87186287 [题意] 题意如果看不懂,请到第二个链接去推一推事例,你就明白这个过程了. 来自题解中glf大佬的解析. 这题目描述真是令人窒息. 3个条件的意思大概是这样: (1).如果有单词作为现在正在填入的单词的后缀但并未填入,将花费n*n的代价. (2).如果没有单词作为当前填入单词

【Trie】The XOR Largest Pair

[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对于每一个串都跑一遍.如果存在当前位 不同的 节点,就往那里跑,否则顺着跑. 一切尽在代码中. [代码] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10;

【Trie】The XOR-longest Path

[题目链接]: https://loj.ac/problem/10056 [题意] 请输出树上两个点的异或路径  的最大值. [题解] 这个题目,y总说过怎么做之后,简直就是醍醐灌顶了. 我们知道Xor路径,我们从根结点处理所有结点的  到根结点的异或和,我们想要两个点的异或路径. 其实就是利用根结点  到两个点  异或和 .因为LCA到根结点异或了两遍,所以答案就保留了异或路径的部分. 其实这个题目就是Xor——pair的变种. 处理从根结点出发的所有结点的位置的异或值. [代码] 1 #in

【Trie】bzoj1212 [HNOI2004]L语言

枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> #include<cstring> using namespace std; int n,m,L; char s[1024*1024+100]; int ch[21*11][26]; bool is[21*11],end[1024*1024+100]; int sz; void Insert(c

【Trie】Trie字典树模板 静态指针池、数组写法

下面是数组写法: #include <cstdio> #include <string> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define idx(x) x - 'a'; const int MAXN = 1e6; struct Trie { int next[26];

[POJ3764]The xor-longest Pat【Trie】

[POJ3764]The xor-longest Path 题目大意:给出一棵有\(N\)个节点的树,树上每条边都有一个权值.从树中选择两个点\(x\)和\(y\),把\(x\)到\(y\)的路径上的所有边权\(xor\),求最大值(\(N\le {10}^5\)) 令\(d[x]\)为\(x\)到根的路径\(xor\),易得\(xor_{x->y}=d[x]\; xor\; d[y]\),问题就转化为求最大的\(d[x]\; xor\; d[y]\).按位贪心就好 int ch[Maxm][2

10-1-字典树【trie】

1.什么是字典树 原文地址:https://www.cnblogs.com/lpzh/p/12551438.html

【trie树专题】

[map || trie]P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). 题目描述 这之后校长任命你为特派探员,每天记录他的点名.校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名.(为什么不直接不让他玩炉石.) 输入格式 第一行一个整数 n,表示班上人数.接下来 n 行,每行一个字符串表示其