poj1056 (Trie入门)寻找字符串前缀

题意:给你一堆字符串,问是否满足对于任意两个字符串a、b,a不是b的前缀

trie入门题,只用到了insert和query操作

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 #define maxnode 1000
 6 #define sigma_size 30
 7
 8 //struct Trie
 9 //{
10     int ch[maxnode][sigma_size];        //ch[i][j]:记录结点i的那个编号为j的子节点
11     int val[maxnode];                    //val[i]:i节点的附加信息,这里我们用来记录是否到一个单词的结束
12                                         //(即在trie树上root->i一路下来是否是一个完整的单词)
13     int sz;
14     void Trie()
15     {
16         sz=1;
17         memset(ch[0],0,sizeof(ch[0]));
18     }
19     int idx(char c)                       //idx(c)即字符c的编号。
20     {
21         return c-‘0‘;                    //此处第一个字符是0所以return c-‘0‘
22     }
23     void Insert(string s,int v)
24     {
25         int u=0,n=s.length();
26         for (int i=0;i<n;i++)
27         {
28             int c=idx(s[i]);
29             if (!ch[u][c])
30             {
31                 memset(ch[sz],0,sizeof(ch[sz]));
32                 val[sz]=0;
33                 ch[u][c]=sz++;
34             }
35             u=ch[u][c];
36         }
37         val[u]=v;
38     }
39     bool query(string s)     //true:s is a prefix
40     {
41         int u=0,c;
42         for (int i=0;i<s.length();i++)
43         {
44             c=s[i]-‘0‘;
45             if (!ch[u][c])    return false;
46
47             u=ch[u][c];
48             if (val[u]==1)  return true;    //若此时s还没走完但trie树上已经走到结尾了,即树上单词是s的前缀
49         }
50         return true;
51     }
52 //};
53
54 bool ok;
55 string str;
56
57 int main()
58 {
59     //freopen("in.txt","r",stdin);
60
61     ok=true;
62     Trie();
63     int num=0;
64     while (cin>>str)
65     {
66         if (str=="9")
67         {
68             num++;
69             if (ok)
70                 printf("Set %d is immediately decodable\n",num);
71             else
72                 printf("Set %d is not immediately decodable\n",num);
73             ok=true;
74             Trie();
75         }
76         else
77         {
78             if (query(str))
79                 ok=false;
80             Insert(str,1);
81         }
82     }
83 }

扩展:

1.用trie实现字符串排序?

直接对trie树前序遍历一遍即可

http://www.cnblogs.com/shuaiwhu/archive/2012/05/05/2484676.html

2.trie还有删除操作,不过实现比较麻烦。先mark一个

http://www.cnblogs.com/dolphin0520/archive/2011/10/11/2207886.html

时间: 2024-10-03 23:04:54

poj1056 (Trie入门)寻找字符串前缀的相关文章

POJ 1056 IMMEDIATE DECODABILITY Trie 字符串前缀查找

POJ1056 给定若干个字符串的集合 判断每个集合中是否有某个字符串是其他某个字符串的前缀 (哈夫曼编码有这个要求) 简单的过一遍Trie就可以了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algor

LA ——3942 - Remember the Word(Trie 入门)

3942 - Remember the Word Regionals 2007 >> Asia - Nanjing Time limit: 3.000 seconds ------------------------------------------------------ 从右往左地推,令dp[i] 表示字符串  S[i....len]的分解方案数,则dp[i]=sum(dp[i+len(x)])  ,我们只要枚举 S[i....len]的前缀,在所给的单词中查找前缀,如果存在,则进行状态

Swift入门篇-字符串和字符

今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本类型不是清楚,请查阅. Swift入门篇-基本类型(1) Swift入门篇-基本类型(2) Swift入门篇-基本类型(3) 一:创建空字符串 //-------------定义一个空字符串第一种方法 var str1="" //-------------定义一个空字符串第二种方法 var

KMP的妙用(利用next数组寻找字符串的循环节)

利用KMP的next数组的性质,我们可以找到next数组的循环节. 先说结论: 设字符串长n,则若其  i % ( i – next[n] ) == 0 ,则其有循环节(循环节数目大于1),其循环节数目为 i / ( i – next[n] ) 这里的next数组存储的是匹配到i匹配不成立时,下一个要匹配的位置.即next数组记录的是下一次匹配的位置,而不是下一次匹配的偏移量,若是记录的偏移量,只需修改一下公式即可. 言归正传,我们先证明第一个结论,根据下图来进行说明: 若结论中的关系成立(整除

寻找字符串中出现字符最多的次数,出现次数最多的字符,出现次数最多的字符的索引

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <link rel="stylesheet" href="css.css"> <script src="js.js"></script>

使用正则表达式寻找字符串中出现了几个[***]样式的字符串

使用正则表达式寻找字符串中出现了几个[***]样式的字符串 源码如下: - (NSUInteger)analyseRX:(NSString *)string withPatternString:(NSString *)patternString { // \\[[^\\]]+\\] 用以匹配字符串中所出现的 [*] 的个数 // <[^>]+> 用以匹配字符串中所出现的 <*> 的个数 if (string == nil) { return 0; } // 正则表达式 NSR

UVA 10010- Where&#39;s Waldorf?(八方向寻找字符串)

Where's Waldorf? Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Where's Waldorf?  Given a m by n grid of letters, ( ), and a list of words, find the location in the grid at which the word can be foun

字符串前缀,真前缀,后缀,真后缀,及前缀函数

举个例子,如字符串 ababc 首先,不考虑空字符,所有的前缀有a, ab, aba, abab, ababc,其中真前缀有a, ab, aba, abab 同理可以理解后缀,真前(后)缀就是指不包含自身的前(后)缀 前缀函数next[j]是指某个字符串的最长真后缀同时也是它的前缀的子串长度.不太理解可以看下面的例子 a -> 0 ab -> 0 aba -> 1 abab -> 2 ababc -> 0 前缀函数在字符串的匹配中用的较多,如KMP等.它主要是表明在一次匹配失

UVA 12718 Dromicpalin Substrings(寻找字符串连续子串的回文)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4456 题意:寻找给出字符串的字串中是回文的个数(注意:字串中字母换位置后能组成回文也要算在内,例如:aab之类的可以换位置为:aba 也是一个回文). 思路:只需统计每个字母出现的次数,再统计出现次数中