首页 > 代码库 > poj1056 (Trie入门)寻找字符串前缀
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 prefix40 {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 else72 printf("Set %d is not immediately decodable\n",num);73 ok=true;74 Trie();75 }76 else77 {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
poj1056 (Trie入门)寻找字符串前缀
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。