简单trie:
http://hihocoder.com/problemset/problem/1014
// http://hihocoder.com/problemset/problem/1014
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
struct trie{
const static int maxnode=1e6+7;
const static int sigma_size=26;
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int id(char c)
{
return c-'a';
}
void insert(char *s)
{
int i,j,len=strlen(s);
int u=0;
for(i=0;i<len;++i)
{
int c=id(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
val[u]++;
}
}
int find(char *s)
{
int i,j,len=strlen(s);
int u=0;
for(i=0;i<len;++i)
{
int c=id(s[i]);
if(!ch[u][c]) return 0;
u=ch[u][c];
}
return val[u];
}
}trie;
int n,m,ans;
char s[maxn];
void doit()
{
int i,j,k;
trie.init();
cin>>n;
for(i=1;i<=n;++i)
{
scanf("%s",s);
trie.insert(s);
}
cin>>m;
for(i=0;i<m;++i)
{
scanf("%s",s);
printf("%d\n",trie.find(s));
}
return;
}
int main()
{
int i,j,k,T;
doit();
return 0;
}
一些细节:
1.init函数要注意ch数组只清ch【0】,之后每建一个节点,清一个节点的子节点和节点信息(val)
2.注意sz的初始化和改变(sz++)
—–
01trie:
http://acm.uestc.edu.cn/#/problem/show/1582
// http://acm.uestc.edu.cn/#/problem/show/1582
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
const int maxn=1;
typedef long long ll;
struct Trie{
const static int Maxn=4e6+7;
int ch[Maxn][2],sz,val[Maxn];
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
void insert(int now)
{
int u=0;
for(int i=30;i>=0;--i)
{
int c=(now>>i)&1;
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=now;
}
int search(int now)
{
int u=0;
for(int i=30;i>=0;--i)
{
int c=(now>>i)&1;
if(ch[u][c^1])
{
u=ch[u][c^1];
}
else
{
u=ch[u][c];
}
}
return now^val[u];
}
}trie;
int n,m;
/*
string trans(int now)
{
string a="";
for(int i=0;i<31;++i)
{
char c=now%2+'0';
a=c+a;
now/=2;
}
return a;
}*/
int main()
{
int i,j,k,T;
trie.init();
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&j);
trie.insert(j);
}
scanf("%d",&m);
for(i=1;i<=m;++i)
{
scanf("%d",&j);
printf("%d\n",trie.search(j));
}
return 0;
}
一些细节:
1.普通trie的注意
2.用位运算而不用字符串,效率提高约5倍