uestc oj 1828 中二少女与字符串

中二少女与字符串


第一次写字典树  参照了别人的写法,下面代码是自己所写。
此题运用字典树
因为此题要计算不重复的所有好串个数运用字典树,每次新建一个节点就res++ 当遇到相同的好串的时候一定不会新建
节点的。
建立一个结构体node  里面是26个相同的node节点next  分别对应着a~z26个字母
首先建立一个空树 当后继节点next[i] 为空时 说明这个节点的串还未找到
在输入待测字符串和坏串最大长度之后,求出字符串的长度然后依次从第一个字母开始遍历数组
每次遍历的结束条件是坏字母个数大于k或者到达字符串结束处
每次新建节点时res++(将res设为全局变量) 最后就可以输出总数


字典树时间复杂度:它的插入和查询复杂度都为O(len),Len为单词(前缀)长度  
空间复杂度为O(26^n)这也太大了

#include<cstdio>
#include<cstring>
#define N 4000000


struct node
{
    node* next[26];      
};
node tree[N];            
                      
int T,len,res,K; char num[26]; char s[1600]; char *str;
int id;


node* createNewId()
{
   for(int i=0;i<26;i++)
      tree[id].next[i] = NULL;
   return &tree[id++];
}


void find(node* now,char* str,int count)
{


   if(num[*str-'a']=='0') count++;
   if(count>K||*str=='\0') return;
   if((now->next[*str-'a'])!=NULL)
   {
       find(now->next[*str-'a'],str+1,count);
   }
   else
   {
       res++;
       now->next[*str-'a'] = createNewId();
       find(now->next[*str-'a'],str+1,count);
   }
}


int main()
{
   //freopen("1.txt","r",stdin);
   scanf("%d",&T);
   while(T--)
   {
       id =0;
       node* root = createNewId();
       scanf("%s",s);
       scanf("%s",num);  
       //printf("%c",num['b'-'a']);
       scanf("%d",&K);
       len = strlen(s);
       res = 0;
       for(int i =0;i<len;i++)
       {
           str = &s[i];
           find(root,str,0);
       }
       printf("%d\n",res);
   }
   return 0;
}


你可能感兴趣的:(字典树)