字段树求前缀。
这里长短不一,只有存在前缀即可。
如果我们存下来排序会超时。
所以我们不能存下来。
如果已存的长,我们要找的短。那么我们只要遍历短的,如果短的全部都是已经存在的点。那么短的就是长的的内存。
如果已存的短,我们在短的最后一个字母处放一个flag,遍历长的,如果长的经历到这个点,发现这个点存在flag,说明短的是这个长的的前缀。
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <cstdlib>
- using namespace std;
- const int M=100005;
- struct node
- {
- int cnt;
- node *child[2];
- node()
- {
- cnt=0;
- for(int i=0; i<2; i++)
- child[i]=NULL;
- }
- };
- char a[15];
- int flag;
- node *root,*cur,*newnode;
- void insert(char *a)
- {
- cur=root;
- int len=strlen(a);
- for(int i=0; i<len ; i++)
- {
- int index=a[i]-'0';
- if(cur->child[index]!=NULL)
- {
- cur=cur->child[index];
- if(cur->cnt==1 || i==len-1)
- {
- flag=0;//标记
- break;
- }
- }
- else
- {
- newnode=new node;
- cur->child[index]=newnode;
- cur=newnode;
- }
- }
- cur->cnt=1;
- }
- void del(node *head)
- {
- for(int i=0; i<2; i++)
- if(head->child[i]!=NULL)
- del(head->child[i]);
- delete(head);
- }
- int main()
- {
- int g=1;
- while(scanf("%s",a)!=EOF)
- {
- flag=1;//标记默认为1
- root=new node;
- insert(a);
- while(scanf("%s",a)!=EOF)
- {
- if(strcmp(a,"9")==0)break;
- {
- if(!flag)
- continue;
- insert(a);
- }
- }
- if(flag)printf("Set %d is immediately decodable\n",g++);
- else
- printf("Set %d is not immediately decodable\n",g++);
- del(root);
- }
- return 0;
- }