用指针版本在HDUOJ上的G++会超内存,用C++可以过。
用数组版本在HDUOJ上的G++就可以过了。
指针版本和数组版本其实用的内存理论上是等价的。
原来应该是HDUOJ的评测机是windows运行G++,编译应该会有一些问题。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2846
指针版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 26
struct Trie{
Trie * next[maxn];
int v;
};
Trie * root;
int cmp(const void * a1,const void * a2){
char * p1 = (char *)a1;
char * p2 = (char *)a2;
return strcmp(p1,p2);
}
void Init_Trie(){
root = (Trie *)malloc(sizeof(Trie));
for(int i=0;i<maxn;i++){
root -> next[i] = NULL;
}
}
void Add_Trie(char * str){
Trie * p = root , * q;
for(int i=0;str[i]!='\0';i++){
int id = str[i] - 'a';
if(p->next[id]==NULL){
q = (Trie *)malloc(sizeof(Trie));
q -> v = 0;
for(int j=0;j<maxn;j++){
q -> next[j] = NULL;
}
p -> next[id] = q;
p = p -> next[id];
}
else {
p = p -> next[id];
}
}
p -> v ++;
}
int Search_Trie(char * str){
Trie * p = root;
for(int i=0;str[i]!='\0';i++){
int id = str[i] - 'a';
p = p -> next[id];
if(p==NULL){
return 0;
}
}
return p -> v;
}
void Del_Trie(Trie * p){
for(int i=0;i<maxn;i++){
if(p->next[i])Del_Trie(p->next[i]);
}
free(p);
}
void Input(){
int n;
char a[25],b[505][25];
while(~scanf("%d",&n)){
Init_Trie();
for(int ii=0;ii<n;ii++){
scanf("%s",a);
int ki = 0;
for(int i=0;i<strlen(a);i++){
for(int j=i;j<strlen(a);j++){
int k;
for(k=i;k<=j;k++){
b[ki][k-i] = a[k];
}
b[ki][k-i] = 0;
ki++;
}
}
qsort(b,ki,sizeof(b[0]),cmp);
Add_Trie(b[0]);
for(int i=1;i<ki;i++){
//if(ii==11)puts(b[i]);
if(strcmp(b[i],b[i-1]))
Add_Trie(b[i]);
}
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",a);
printf("%d\n",Search_Trie(a));
}
Del_Trie(root);
}
}
void File(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main(void){
// File();
Input();
return 0;
}
数组版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 26
int d[500000][maxn];
int value[500000];
int tot;
int cmp(const void * a1,const void * a2){
char * p1 = (char *)a1;
char * p2 = (char *)a2;
return strcmp(p1,p2);
}
void Init_Trie(){
memset(d,0,sizeof(d));
memset(value,0,sizeof(value));
}
void Add_Trie(char * str){
int t = 0;
for(int i=0;str[i]!='\0';i++){
int id = str[i] - 'a';
if(d[t][id]==0){
d[t][id] = tot ++;
t = d[t][id];
}
else {
t = d[t][id];
}
}
value[t] ++;
}
int Search_Trie(char * str){
int t = 0;
for(int i=0;str[i]!='\0';i++){
int id = str[i] - 'a';
t = d[t][id];
if(t == 0){
return 0;
}
}
return value[t];
}
void Input(){
int n;
char a[25],b[505][25];
while(~scanf("%d",&n)){
tot = 1;
for(int ii=0;ii<n;ii++){
scanf("%s",a);
int ki = 0;
for(int i=0;i<strlen(a);i++){
for(int j=i;j<strlen(a);j++){
int k;
for(k=i;k<=j;k++){
b[ki][k-i] = a[k];
}
b[ki][k-i] = 0;
ki++;
}
}
qsort(b,ki,sizeof(b[0]),cmp);
Add_Trie(b[0]);
for(int i=1;i<ki;i++){
//if(ii==11)puts(b[i]);
if(strcmp(b[i],b[i-1]))
Add_Trie(b[i]);
}
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",a);
printf("%d\n",Search_Trie(a));
}
}
}
void File(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main(void){
//File();
Input();
return 0;
}