字典树——hdu 2846

    xiaoxiao2021-03-26  23

    这个题还是有点实际意义的。然后就是和那个帽子的题相似,因为其中有一点掉了,所以特此标记。 代码

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define maxn 26 typedef struct Trie { int v; int h; Trie *next[maxn]; }; char s[10005][25]; Trie *root; void create(char *str,int h) { int len=strlen(str); Trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { q=new Trie; q->v=1; q->h=h; for(int j=0;j<maxn;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { p=p->next[id]; if(p->h!=h) { p->v++; p->h=h;//这里容易掉 } } } } int findT(char *str) { int len = strlen(str); Trie *p=root; for(int i=0;i<len;i++) { int id= str[i]-'a'; if(p->next[id]==NULL) return 0; p=p->next[id]; } return p->v; } void Rlease(Trie *p) { if(NULL==p) return ; for(int i=0;i<maxn;i++) if(p->next[i]!=NULL) Rlease(p->next[i]); free(p); root=NULL; return; } int main() { int n; root=new Trie; root->v=0; root->h=-1; for(int i=0;i<maxn;i++) root->next[i]=NULL; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",s[i]); } char a[25]; for(int j=0;j<n;j++) { int len=strlen(s[j]); for(int k=0;k<len;k++) { memset(a,0,sizeof(a)); strncpy(a,s[j]+k,len-k);//是倒序的 create(a,j); } } int q; scanf("%d",&q); char b[25]; while(q--) { scanf("%s",b); printf("%d\n",findT(b)); } Rlease(root); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-662223.html

    最新回复(0)