https://www.luogu.org/problem/show?pid=2580
字典树trie;
感觉所有树里面字典树最好理解了;
但是操作直接到指针;
这个我调了40min;
感觉和p转c++时差不多,很傻逼的错误调好久;
字典树感觉不用讲什么
还有
a->b==(*a).b
#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
#define N 26
using namespace std;
struct trie{
trie *nxt[N];
int v;//有几个名字,就是一个end标记
bool vi;//有木有被点名
trie(){memset(nxt,0,sizeof nxt);v=0;vi=0;}//构造函数
};
trie rt;
char c[100];
int n,m;
void insert(char c[]){
int l=strlen(c);
trie *o=&rt; //o是一个指针,这里为什么要用指针,就是指针支持修改任意地址的值,
for(int i=0;i<l;i++){
int x=c[i]-'a';
if(!o->nxt[x]){
trie *y=new trie;//一定要新开一个地址,这样是全局的
o->nxt[x]=y;
}
o=o->nxt[x];
}
o->v++;
}
int find(char c[]){
int l=strlen(c);
trie *o=&rt;
for(int i=0;i<l;i++){
int x=c[i]-'a';
if(!o->nxt[x])return -1;
o=o->nxt[x];
}
if(!o->v)return-1;
if(o->vi)return 0;
o->vi=1;
return 1;
}
int main()
{
scanf("%d",&n);
while(n--){
scanf("%s",c);
insert(c);
}
scanf("%d",&n);
while(n--){
scanf("%s",c);
int k=find(c);
if(k>0)printf("OK\n");
if(!k)printf("REPEAT\n");
if(k<0)printf("WRONG\n");
}
}
然后这个是非指针的;
指针有些题会MLE;
#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
#define N 26
using namespace std;
struct trie{
int nxt[N];
int v;
bool vi;
trie(){memset(nxt,0,sizeof nxt);v=0;vi=0;}
}T[500001];
trie rt;
char c[100];
int n,m,ll;
void insert(){
int l=strlen(c);
int o=0;
for(int i=0;i<l;i++){
int x=c[i]-'a';
if(!T[o].nxt[x])T[o].nxt[x]=++ll;
o=T[o].nxt[x];
}
T[o].v++;
}
int find(){
int l=strlen(c);
int o=0;
for(int i=0;i<l;i++){
int x=c[i]-'a';
if(!T[o].nxt[x])return -1;
o=T[o].nxt[x];
}
if(!T[o].v)return-1;
if(T[o].vi)return 0;
T[o].vi=1;
return 1;
}
int main()
{
scanf("%d",&n);
while(n--){
scanf("%s",c);
insert();
}
scanf("%d",&n);
while(n--){
scanf("%s",c);
int k=find();
if(k>0)printf("OK\n");
if(!k)printf("REPEAT\n");
if(k<0)printf("WRONG\n");
}
}