原来数组分配小了会出现: Runtime Error :ACCESS_VIOLATION 的错误
第一种方法,自己写的一直 Memory Limit Exceeded (MLE) 参考了http://www.cnblogs.com/dolphin0520/archive/2011/10/18/2216208.html:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define M 26
typedef struct _Node{
int count;
int fm;
struct _Node* next[M];
}Node, *pNode;
int n;
pNode memory(){
pNode p = (pNode)malloc(sizeof(Node));
memset(p, 0, sizeof(Node));
p->fm = -1;
return p;
}
void insert(pNode root, char* s, int fm){
int i, k;
pNode p = root;
i = 0;
while(s[i]){
k = s[i]-'a';
if(p->next[k]==0)
p->next[k] = memory();
p = p->next[k];
if(p->fm != fm){
p->fm = fm;
p->count++;
}
i++;
}
}
int query(pNode root, char* s){
int i, k;
pNode p;
if(root) p = root; else return 0;
i = 0;
while(s[i]){
k = s[i]-'a';
if(p->next[k])
p = p->next[k];
else
return 0;
i++;
}
return p->count;
}
void main(){
int i, l, k;
char s[25];
pNode root;
freopen("in.txt", "r", stdin);
root = memory();
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%s", s);
k = strlen(s);
for(l=0; l<k; l++)
insert(root, s+l, i);
}
scanf("%d", &k);
for(i=0; i<k; i++){
scanf("%s", s);
printf("%d\n", query(root, s));
}
}
第二种方法,使用递归,超时:
#include "stdio.h"
#include "string.h"
#define M 26
typedef struct _Node{
int count;
struct _Node* next[M];
}Node, *pNode;
Node tree[200000];
int pos;
pNode memory(){
pNode p = &tree[pos++];
memset(p, 0, sizeof(p));
return p;
}
void insert(pNode root, char* s){
int i, k;
pNode p = root;
i = 0;
while(s[i]){
k = s[i]-'a';
if(p->next[k]==0)
p->next[k] = memory();
p = p->next[k];
p->count++;
i++;
}
}
int query(pNode root, char* s){
int i, k;
pNode p;
if(root) p = root; else return 0;
i = 0;
while(s[i]){
k = s[i]-'a';
if(p->next[k])
p = p->next[k];
else
return 0;
i++;
}
return p->count;
}
int find(pNode root, char* s){
int i;
int sum = 0;
int k = s[0] - 'a';
if(!root) return 0;
for(i=0; i<k; i++){
sum += find(root->next[i], s);
}
sum += query(root, s);
for(i=k+1; i<M; i++){
sum += find(root->next[i], s);
}
return sum;
}
void main(){
int n, i;
char s[25];
pNode root;
freopen("in.txt", "r", stdin);
pos = 0;
root = memory();
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%s", s);
insert(root, s);
}
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%s", s);
printf("%d\n", find(root, s));
}
}