中二少女与字符串
第一次写字典树 参照了别人的写法,下面代码是自己所写。
此题运用字典树
因为此题要计算不重复的所有好串个数运用字典树,每次新建一个节点就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;
}