判断一个串是否是其他的前缀
我们需要建立一颗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 举报,一经查实,本站将立刻删除。