这题输入不习惯。处理输入废了不少时间。
在杭电oj上查看不少Accept提交的时间和空间,三叉树写的字典树无论是内存和时间上都优于大多数。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<string>
using namespace std;
typedef int Nodelink;
struct Node
{
Nodelink lson, subtree, rson;
int count;
char ch;
}Node[1000010];
int top;
Nodelink newNode(char ch)
{
Node[++top].ch = ch;
Node[top].lson = Node[top].rson = Node[top].subtree = Node[top].count = 0;
return top;
}
void insert(int root, char str[])
{
Nodelink p = root;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
while(Node[p].ch != str[i])
{
if(str[i] < Node[p].ch)
{
if(!Node[p].lson)Node[p].lson = newNode(str[i]);
p = Node[p].lson;
}
else {
if(!Node[p].rson)Node[p].rson = newNode(str[i]);
p = Node[p].rson;
}
}
if(!Node[p].subtree)Node[p].subtree = newNode('\0');
p = Node[p].subtree;
Node[p].count ++;
}
}
int find(int top, char str[])
{
int len = strlen(str);
Nodelink p = top;
for(int i = 0; i < len; i++)
{
while(str[i] != Node[p].ch)
{
if(str[i] < Node[p].ch)
if(!Node[p].lson)return 0;
else p = Node[p].lson;
else
if(!Node[p].rson)return 0;
else p = Node[p].rson;
}
if(!Node[p].subtree)return 0;
else p = Node[p].subtree;
}
return Node[p].count;
}
int main()
{
char str[12];
top = 0;
char ch;
newNode('\0');
while(ch = getchar())
{
if(ch == '\n')break;
int stp = 0;
str[stp++] = ch;
while(ch = getchar())
{
if(ch == '\n')break;
str[stp++] = ch;
}
str[stp] = '\0';
insert(1, str);
}
int stp = 0;
while(~scanf("%s", str))
{
stp = 0;
stp = find(1, str);
printf("%d\n",stp);
}
return 0;
}