HDU 2846 Repository (字典树 统计个数)

2014-11-24 12:04:01 · 作者: · 浏览: 1


题意:

给你 n 个单词库,m个询问,每个询问给你一个目标单词str,问在n个单词库中str为其子串有多少个。


思路:

对单词库中的每个单词的字串都建一次树,同一个串的字串可能有相同前缀的字串,

所以添加变量记录在同一个串是否已经计数过。


#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include 
         
           #include 
          
            #include
           
             #include
            
              using namespace std; #define INF 1e8 #define eps 1e-8 #define LL long long #define maxn 26 #define mol 1000000007 char s[22]; struct Trie { Trie *next[maxn]; int v; int id; }root; void creatTrie(char *str,int k) { int len = strlen(str); Trie *p = &root,*q; for(int i=0;i
             
              next[id]==NULL) { q=(Trie *)malloc(sizeof(Trie)); q->v=1; q->id=k; for(int j=0;j
              
               next [j]=NULL; p->next [id]=q; p=p->next [id]; } else { p=p->next[id]; } if(p->id!=k) { p->id=k; p->v++; } } //p->v=1; } int find (char *str) { int len = strlen(str); Trie *p=&root; for(int i=0;i
               
                next[id]; if(p==NULL) return 0; } return p->v ; } int deal(Trie *T) { int i; if(T==NULL) return 0; for(i=0;i
                
                 next [i]!=NULL) deal(T->next[i]); free(T); return 0; } int main() { int i,n,m; for(i=0;i