有一个字符串序列 S,初始时是空的,定义以下两种操作:
i x 在序列的末尾插入字符串 x。
q x 输出在序列 S 中有几个字符串是以 x 为前缀的。
字符串 x 的长度小于 10, 只包含小写字母。
★数据输入
输入第一行是一个整数m(1<=m<=100000),表示有m 种操作。
接下来m 行,表示 m 种操作。
★数据输出
对于每个 q 操作,输出一行一个整数,表示在序列 S 中有几个字符串是以 x 为前缀的。
输入示例 输出示例
8 2
i ajasz 2
i jeaa 0
i aj
q aj
i jeaazz
i j
q jeaa
q abc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
struct Tree
{
Tree *next[26];
int n;
};
void insert(Tree *root, char *str)
{
int i, j, id, len = strlen(str);
Tree *p = root, *q;
for (i = 0; i<len; i++)
{
id = str[i] - 'a';
if (p->next[id] == NULL)
{
q = (Tree *)malloc(sizeof(Tree));
q->n = 1;
p->next[id] = q;
for (j = 0; j<26; j++)
q->next[j] = NULL;
p = p->next[id];
}
else
{
p->next[id]->n++;
p = p->next[id];
}
}
}
int find(Tree *root, char *str)
{
int i, id, len = strlen(str);
Tree *p = root;
for (i = 0; i<len; i++)
{
id = str[i] - 'a';
if (p->next[id] != NULL)
p = p->next[id];
else
return 0;
}
return p->n;
}
int main()
{
int N;
char ch, temp[10];
scanf("%d", &N);
getchar();
Tree root;
for (int i = 0; i<26; i++)
root.next[i] = NULL;
root.n = 0;
for (int k = 0; k<N; k++)
{
scanf("%c ", &ch);
if (ch == 'i')
{
gets(temp);
insert(&root, temp);
}
else
{
gets(temp);
printf("%d\n", find(&root, temp));
}
}
return 0;
}