點擊打開鏈接
統計難題
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 43775 Accepted Submission(s): 15692
注意:本題只有一組測試數據,處理到文件結束.
#include <cstdio>
#include <cstring>
#define MAX 1000000+10
using namespace std;
char str[1000];
char ask[1000];
int ch[MAX][40];
int word[MAX];//記錄該節點下的單詞數目
int val[MAX];//標記單詞 結點
int sz;
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
memset(word, 0, sizeof(word));
}
int idx(char x)
{
return x - 'a';
}
void insert(char *s)
{
int i, j, l = strlen(s);
int u = 0;
for(i = 0; i < l; i++)
{
int c = idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
word[u]++;
}
val[sz] = 1;//標記單詞節點
}
int find(char *s)
{
int i, j, l = strlen(s);
int u = 0;
for(i = 0; i < l; i++)
{
int c = idx(s[i]);
if(!ch[u][c]) return 0;//不存在
u = ch[u][c];
}
return word[u];
}
int main()
{
init();
while(gets(str), str[0])
{
insert(str);
}
while(scanf("%s", ask) != EOF)
{
printf("%d\n", find(ask));
}
return 0;
}