題意:給你一些字符串,要你判斷有沒有其中的一個字符串是另外一個字符串的前綴。
題解:字典樹解決。
AC代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef __int64 LL; const int N=2; const LL mod=1000000007LL; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); char s[15]; struct Trie { Trie *next[N]; int v; Trie() { v=1; for(int i=0;i<N;i++) next[i]=NULL; } }*root; void setroot() { root=(Trie *)malloc(sizeof(Trie)); for(int i=0;i<N;i++) root->next[i] = NULL; } void createTrie(char *str) { int i,j,id; int len=strlen(str); Trie *p=root,*m; for(i=0;i<len;i++) { id=str[i]-'0'; if(p->next[id]==NULL) { p->next[id]=new Trie(); p=p->next[id]; } else { p=p->next[id]; } } p->v++; } int findTrie(char *str) { int i,id; int len=strlen(str); Trie *p=root; for(i=0;i<len;i++) { id=str[i]-'a'; p=p->next[id]; if(p==NULL) //若為空集,表示不存以此為前綴的串 return 0; } return p->v; //此串是字符集中某串的前綴,這個地方可能要判斷是否在結尾節點 } void dealTrie(Trie *T) {//若果有多組數據-多棵樹,那麼要釋放內純 int i; if(T==NULL) return ; for(i=0;i<N;i++) if(T->next[i]!=NULL) dealTrie(T->next[i]); free(T);//釋放 } int flag; void dfs(Trie *Tr) { if(flag) return ; if(Tr->v>1&&(Tr->next[0]!=NULL||Tr->next[1]!=NULL)) { flag=1; return ; } for(int i=0;i<2;i++) { if(Tr->next[i]==NULL) continue; dfs(Tr->next[i]); } } int main() { int i,j,p=1,ca=0; while(scanf("%s",s)!=EOF) { if(p) root=new Trie(); if(strcmp(s,"9")!=0) { createTrie(s); p=0; } else { flag=0; dfs(root); if(flag) printf("Set %d is not immediately decodable\n",++ca); else printf("Set %d is immediately decodable\n",++ca); dealTrie(root); p=1; } } return 0; } #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef __int64 LL; const int N=2; const LL mod=1000000007LL; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); char s[15]; struct Trie { Trie *next[N]; int v; Trie() { v=1; for(int i=0;i<N;i++) next[i]=NULL; } }*root; void setroot() { root=(Trie *)malloc(sizeof(Trie)); for(int i=0;i<N;i++) root->next[i] = NULL; } void createTrie(char *str) { int i,j,id; int len=strlen(str); Trie *p=root,*m; for(i=0;i<len;i++) { id=str[i]-'0'; if(p->next[id]==NULL) { p->next[id]=new Trie(); p=p->next[id]; } else { p=p->next[id]; } } p->v++; } int findTrie(char *str) { int i,id; int len=strlen(str); Trie *p=root; for(i=0;i<len;i++) { id=str[i]-'a'; p=p->next[id]; if(p==NULL) //若為空集,表示不存以此為前綴的串 return 0; } return p->v; //此串是字符集中某串的前綴,這個地方可能要判斷是否在結尾節點 } void dealTrie(Trie *T) {//若果有多組數據-多棵樹,那麼要釋放內純 int i; if(T==NULL) return ; for(i=0;i<N;i++) if(T->next[i]!=NULL) dealTrie(T->next[i]); free(T);//釋放 } int flag; void dfs(Trie *Tr) { if(flag) return ; if(Tr->v>1&&(Tr->next[0]!=NULL||Tr->next[1]!=NULL)) { flag=1; return ; } for(int i=0;i<2;i++) { if(Tr->next[i]==NULL) continue; dfs(Tr->next[i]); } } int main() { int i,j,p=1,ca=0; while(scanf("%s",s)!=EOF) { if(p) root=new Trie(); if(strcmp(s,"9")!=0) { createTrie(s); p=0; } else { flag=0; dfs(root); if(flag) printf("Set %d is not immediately decodable\n",++ca); else printf("Set %d is immediately decodable\n",++ca); dealTrie(root); p=1; } } return 0; }