統計難題
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 45711 Accepted Submission(s): 16279
注意:本題只有一組測試數據,處理到文件結束.
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int tot;
char s[1001];
int nex[N][26], cnt[N];
void Init(){
tot = 0;
memset(nex[0], -1, sizeof nex[0]);
cnt[0] = 0;
}
void Insert(char a[]){
int l = strlen(a);
int p = 0;
for(int i = 0; i < l; i++){
int id = a[i]-'a';
if(nex[p][id] == -1){
cnt[++tot] = 0;
nex[p][id] = tot;
memset(nex[tot], -1, sizeof nex[tot]);
}
p = nex[p][id];
cnt[p]++;
}
}
int Query(char a[]){
int l = strlen(a);
int p = 0;
for(int i = 0; i < l; i++){
int id = a[i]-'a';
if(nex[p][id] == -1) return 0;
p = nex[p][id];
}
return cnt[p];
}
int main(){
Init();
while(gets(s) && strcmp(s, "") != 0){
Insert(s);
}
while(scanf("%s", s) == 1){
printf("%d\n", Query(s));
}
}