UVA644 Immediate Decodability

UVA644 Immediate Decodability

Trie

Trie模板题

难度几乎相等的题 P2580 于是他错误的点名开始了

对于每组数据都清空树太浪费时间,所以我们只要在需要新点时预先把新点原有的数据清空即可。

剩下除了一些细节要注意,没啥要说的了

(luogu的标签系统有些迷啊)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct data{
    int nxt[2]; bool end;
    void clear() {nxt[0]=nxt[1]=0; end=0;} //清空原先的数据
}a[5000001]; //对于每个节点,存储它的下一个字母,以及是否是某个字母的结束符
char q[2000001];
int cnt; //节点编号
bool ok;
inline void insert(){ 
    int u=0,len=strlen(q); bool ins=0;  //ins:是否插入新节点
    for(int i=0;i<len;++i){
        int p=q[i]-'0';
        if(!a[u].nxt[p]){ //如果之前没有这个节点就插入
            a[++cnt].clear();
            a[u].nxt[p]=cnt; ins=1;
        }
        if(a[u].end) ok=1; //如果某个在它之前插入的单词是它的前缀
        u=a[u].nxt[p]; //跳转到下一个
    }
    if(!ins) ok=1; //如果它是某个在它之前插入的单词的前缀
    a[u].end=1;
}
int main(){
    int t=0;
    while(cin>>q){
        if(q[0]=='9') { //一组数据的结束
            printf("Set %d is ",++t);
            if(ok) printf("not ");
            printf("immediately decodable\n");
            cnt=0; ok=0; a[0].clear(); //注意树根0也要清空
        }else insert();
    }
    return 0;
}

 

posted @ 2018-09-09 08:20  kafuuchino  阅读(150)  评论(0编辑  收藏  举报