您的位置:首页 > 其它

hdu 1305 Immediate Decodability(Trie树)

2014-04-28 20:28 295 查看
小记:1A,在将code插入trie树里,判断插入时是否有其它单词也是这样插的路径上耽搁了下,

思路:trie树,在插入一个code时,如果一路一个一个字符的存入trie树时是没有在哪个字符时是被标记为一个code的时候,那么就返回插入成功。

这里有三种情况,

第一:从第一个就到最后一个字符都是new开辟出来的空间,也就是没有出现过已经被new过的字符

第二:前面的字符都已经被开辟了,到某一个时还没开辟,那么之后的就都开辟

第三,一路都是已经开辟过了的

对于第一种情况,肯定返回插入成功

第二种,如果前面的开辟的字符里,没有一个字符的标记是标记为是一个code的,那么就返回成功,否则返回插入失败,即不是immediate decodability

第三种,那就是当没开辟过,那么肯定是插入失败了,即是前面某个code的prefix前缀

如果插入失败那么之后的code就不需要处理了,直接读完即可

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8

const int MAX_ = 10010;
const int MAX = 10;
const int N = 100010;
const int INF = 0x7fffffff;

typedef struct Node{
int isStr;

struct Node *next[MAX];

Node():isStr(0){
memset(next, NULL, sizeof(next));
}
~Node(){
for(int i = 0;i < MAX; ++i)
if(next[i] != NULL)
delete next[i];
}
}TrieNode,*Trie;

Trie root;

int Insert(char *s){
bool flag = false;
TrieNode *p = root,*q;
while(*s){
if(p ->next[*s-'0'] == NULL){
q = new TrieNode;
p ->next[*s-'0'] = q;
flag = true;
}
if(p->isStr == 1){
return 0;
}
p = p ->next[*s-'0'];
s++;
}
p->isStr = 1;
if(!flag)return 0;
return 1;
}

int main() {
char s[MAX*10], str[MAX*10];
int ans, cnt, len;
bool flag;
flag = true;cnt = 1;
root = new TrieNode;
//ans = 0;flag = false;cnt = 0;
while(scanf("%s",s)!=EOF){
if(s[0] == '9'){
if(!flag){
printf("Set %d is not immediately decodable\n",cnt++);
}
else printf("Set %d is immediately decodable\n",cnt++);

flag = true;
delete root;
root = new TrieNode;
continue;
}
if(flag)
flag = Insert(s);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: