微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pj Immediate Decodability

判断一个串是否是其他的前缀

我们需要建立一颗tire树

在插入边的时候,如果遇到一个其他串的结尾,那么就说明至少有一个串,是插入串的前缀。如果在插入完后没有新增的节点,那么插入的串就是其他串的前缀

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int manx=1<<8;
char data[manx];
int t[manx][2],tail;
int end[manx<<8];
bool flag=false;
void ins()
{
    int last=tail,Now=0;
    int len=strlen(data)-1;
    for(int i=0;i<=len;i++)
    {
        int nxt=data[i]-'0';
        if(!t[Now][nxt])    t[Now][nxt]=++tail;
        if(end[Now])    flag=true;//经过一个串的结尾
        Now=t[Now][nxt];
    }
    end[Now]+=1;
    if(last==tail)  flag=true;//是其他串的前缀
    return ;
}
int main()
{
    int tot=0;
    //freopen("a.in","r",stdin);
    while(scanf("%s",data)!=EOF)
    {
        if(data[0]=='9')
        {
            tot+=1;
            if(!flag)
                printf("Set %d is immediately decodable\n",tot);
            else
            {
                printf("Set %d is not immediately decodable\n",tot);
            }//每一组数据都要初始化
            flag=false;
            memset(t,0,sizeof(t));
            memset(end,sizeof(end));
            tail=0;
            continue;
        }
        if(!flag)   ins();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐