uestc oj 1828 中二少女与字符串

来源:互联网 发布:mac登陆新浪邮箱 编辑:程序博客网 时间:2024/05/01 02:57
中二少女与字符串


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


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

#include<cstdio>#include<cstring>#define N 4000000struct 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;}


原创粉丝点击