代码一,正确AC,490ms,72M
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#define MAX 26
using namespace std;
struct Trie
{
int num;
Trie* next[MAX];
Trie()
{
num=0;
for(int i=0;i<MAX;i++)
next[i]=NULL;
}
}*root;
void insert(char s[])
{
Trie* p = root;
for(int i=0;s[i];i++)
{
int a=s[i]-'a';
if(p->next[a]==NULL)
p->next[a]=new Trie;
p=p->next[a];
p->num++;
}
}
int search(char s[])
{
Trie* p = root;
for(int i=0;s[i];i++)
{
int a=s[i]-'a';
if(p->next[a]==NULL)
return 0;
p=p->next[a];
}
return p->num;
}
int main(){
int n,m;
char s[20];
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
root = new Trie;
for(scanf("%d",&n);n--;)
scanf("%s",s),insert(s);
for(scanf("%d",&m);m--;)
scanf("%s",s),printf("%d\n",search(s));
//fclose(stdin);
//fclose(stdout);
return 0;
}
代码二,正确AC,314ms,41M
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int ch[1000005][26];
int val[1000005],sz;
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
void insert(char *s)
{
int u=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=(s[i]-'a');
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=1;
ch[u][c]=sz++;
u=ch[u][c];
}
else
{
u=ch[u][c];
val[u]++;
}
}
}
int query(char *s)
{
int len=strlen(s),u=0,c;
for(int i=0;i<len;i++)
{
c=s[i]-'a';
if(ch[u][c])
u=ch[u][c];
else return 0;
}
return val[u];
}
};
Trie T;
int main()
{
int i,n,m;
char s[12];
//freopen("in.txt", "r", stdin);
while(~scanf("%d",&n))
{
T.init();
for(i=0;i<n;i++)
{
getchar();
scanf("%s",s);
T.insert(s);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
getchar();
scanf("%s",s);
printf("%d\n",T.query(s));
}
}
//fclose(stdin);
return 0;
}
代码三,出现未知错误,fatal error: iostream: No such file or directory :#include <iostream> 可能是代码中有地方指针使用不当,望指出
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#define MAX 26
using namespace std;
typedef struct Trie
{
int num;
struct Trie* next[MAX];
}Trie;
Trie* create()
{
Trie* node = new Trie;
node -> num = 0;
memset ( node->next, 0, sizeof(node->next) );//?
return node;
}
void insert( Trie* root, char *s )
{
Trie* node = root;
char *p = s;
int i;
while ( *p )
{
i = *p - 'a';
if( node->next[i] == NULL )
{
node->next[i] = create();
}
node = node->next[i];
node->num += 1;
++p;
}
}
int search( Trie* root, char *s )
{
Trie* node = root;
char *p = s;
int i;
while ( *p )
{
i = *p -'a';
node = node->next[i];
if( node == NULL )
return 0;
++p;
}
return node->num;
}
int main ( )
{
Trie* root = create();
int i, N, M;
char s[12];
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> N;
for ( i = 0; i < N; i ++ )
{
cin >> s;
insert ( root, s );
}
cin >> M;
for ( i = 0; i < M; i ++ )
{
cin >> s;
cout << search ( root, s ) << endl ;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}