Trie 树
trie树就是字典树,就是花时间为空间的一种高效查找的数据结构
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> const int maxn=26; int n,m; char s[51]; typedef struct Trienode { bool isStr,iscove; int step; struct Trienode *next[maxn]; }Trie; int sum; void insert_Trie(Trie *root, const char *s) { if (root==NULL || *s=='\0') return; Trie *p=root; while (*s!='\0') { if (p->next[*s-'a']==NULL) { Trie *temp=new(Trie); for (int i=0;i<maxn;i++) temp->next[i]=NULL; temp->isStr=false; temp->iscove=true; temp->step=p->step+1; p->next[*s-'a']=temp; p=p->next[*s-'a']; } else { if (sum<(p->next[*s-'a'])->step) sum=(p->next[*s-'a'])->step; p=p->next[*s-'a']; } s++; } p->isStr=true; p->iscove=true; } bool search_Trie(Trie *root, const char *s) { Trie *p=root; while (p!=NULL && *s!='\0') { p=p->next[*s-'a']; s++; } return (p!=NULL && p->isStr==true); } void del_Trie(Trie *root) { for (int i=0;i<maxn;i++) { if (root->next[i]!=NULL) del_Trie(root->next[i]); } free(root); } int main() { freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { Trie *root=new (Trie); for (int i=0;i<maxn;i++) root->next[i]=NULL; root->isStr=false; root->iscove=false; root->step=0; sum=0; for (int i=0;i<n;i++) { scanf("%s",&s); insert_Trie(root,s); } printf("%d\n",sum); del_Trie(root); } fclose(stdin); return 0; }
这个代码的内存消耗很高,而且速度都不怎么快,不过依然可以处理很多题目了,但是其还是可以用数组来实现
下面是数组实现
#include<map> #include<set> #include<queue> #include<cmath> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define inf 0x0f0f0f0f using namespace std; const double pi=acos(-1.0); const double eps=1e-8; typedef pair<int,int>pii; const int maxn=500000; struct Trie { bool isStr; int next; }trie[maxn][26]; int main() { freopen("in.txt","r",stdin); int cur,len; int alloc=1,n,m; char s[51]; for (int i=0;i<500000;i++) for (int j=0;j<26;j++) { trie[i][j].isStr=false; trie[i][j].next=-1; } scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%s",s); len=strlen(s); cur=0; for (int j=0;j<len;j++) { if (trie[cur][s[j]-'a'].next==-1) { trie[cur][s[j]-'a'].next=alloc; alloc++; } if (j==len-1) trie[cur][s[j]-'a'].isStr=true; cur=trie[cur][s[j]-'a'].next; } } scanf("%d",&m); for (int i=0;i<m;i++) { scanf("%s",s); cur=0; int j; len=strlen(s); for (j=0;j<len;j++) { if (trie[cur][s[j]-'a'].next==-1) {printf("NO\n");break;} if (j==len-1) { if (trie[cur][s[j]-'a'].isStr) printf("YES\n"); else printf("NO\n"); break; } cur=trie[cur][s[j]-'a'].next; } } fclose(stdin); return 0; }
这样Trie树就算这样了
至少做到我努力了