poj 1816 trie树+dfs(强烈推荐,含有通配符的匹配)

这个题目花了我一晚上才调出来,其实也不难,就是在trie树上搜索给定的单词,但是麻烦的一点是考虑的情况非常多,比如模式串可能重复,或者*?连续出现,最开始都没考虑,程序敲出来直接提交一看WA,然后看discuss里面,说模式可能重复我才知道情况比我想的要复杂,重新该了下程序,还是WA,主要是没考虑到情况*后面忘了判断有无*或者?的情况,最后WA了好几次才A的,程序跑了235M,前30呢,哈哈,多亏了某某大牛的一组测试数据。我会在代码后面附上这组数据,希望后面做这个题得不要犯我这钟低级错误。

测试数据:

View Code
1000 100
z
dg
njcjb
ftwkmi
tips
tc
z
*
yg
n
?s
rhwo
mn
yyjm
kfdaqk
ofkku
bdbby
tdqfpw
nmug
ltwbda
*asgjw
*e*f?
ygokm
c
nhz
?
f
at
*ua
h
exflz
ll
whzxxc
v
thbw
krw
cx
p
t
x
muca
o
*
pwx
pbqh
efff
?r
s
ldsr
jpmd
qfvd
*
mz
wkcpy
wqe
?xc
l
jhdq
scaug
v
u
?metd
ei
?*nbqh
jrkx
c
?s
rw
?
oslbg
cw
mwwir
mh
t
ugg
q
dkfbq
s
xwm
bhykgc
yulc
rmy
lvm
sd
*pz*
yn
xje
jzdo
?fsmbh
dgq
bxhx
sulemy
zavniy
njeakb
qzlk
xl
?
vl
yzwsu
*
bpazl
*
ww
aj
ozlqgv
?zrg
whlkx
pu
j
qpqhli
zdcaz
*
yxa
ozdf
afcd
vnh
rzy
ikj
ooazqt
?rtqxf
jfsms
aevlnz
mn
*qbk
catz
*
?
id
sh
idx
?ky
rrht
?
kea
jzz
ynw
sj
kdjdk
jg
z
dpel
t
s
?gujv
fygxgh
oga
*vs
uo
howqj
foy
g
?
hw
wih
g
fu
*ju
?
v
k
*g
fihag
wmnib
mss
*
ip
wapbhx
swie
*p
jd
sk
lapb
wykem
ibtsv
sonqn
yghby
?e?i
yhertj
i
zcsgx
e
q
dj
vnq
elswq
g
i
idm
*i?
rxsox
*
ca
?*j
syht
kc
qt
u
urfdtg
ho
m
iesahj
gip
q
*gr
?ob*
odwp
e
kyj
fj
*nx
xf
ey
?azn
wa
bi
dyhd
lgjxd
bg
*rsc
zx
?ok
yq
u
?
zs
d
hxuqxa
f
xfpm
ahn
ajcglk
xulf
?eht
zx
*icvei
tjmoid
ova
e
vr
z
p
o
vbx
p
a
?bj
hlk
d
pmczh
fe
oo
c
?*hf
bsgwh
p
*hytm
mo
*eip
owefwr
p
vuwtjb
w
*qiqm
fvbun
zqkj
zeoh
?
q
tgs
?
eac
w
ij
fhd
eau
*jo
okwxn
e
?hv
ciyek
lxf
rip
jcgmj
o
?fdc
f
nw
nr
axxh
zmijch
l
*wl
kzk
ba
x
uqygjw
jsewig
rgs
akp
?
ns
txzd
vlaoq
jy
z
ykqs
ickqdq
qosxo
xty
b
yyicz
caei
?e
onc
ek
?*
prnc
veh
wivlc
fi
?u
ztlt
ui
?yf
dsrnwl
kc
qjgrq
bjwaik
*opn
f
tcxl
c
*gor
twkmoi
?**
ncuc
jf
?ln
findj
byihj
d
wey
z
q
*ecv
aea
tzvm
?
hrotv
abvqbm
v
ew
bui
jnhzu
gfcpdv
lorb
**
trlju
?
evfnav
inf
zxfjxf
?
elnfpc
ro
b
?e
khrart
jnc
rgzubc
anig
*i
?tegju
g
xf
qf
wlm
n
qonllp
ofsey
wjazx
?
aunzkh
uq
w
?fftb
?jbw*c
rlc
xwegw
zfsny
to
?x
syn
vryo
bqkok
?spq
tgpat
?hxmw
hzt
wr
qrs
?*m
lcham
?tr
ym
*zygdp
tx
jn
?f
mhe
*ctv
l
iofza
kqx
*t
qk
?
vz
f
gpm
xxur
rmfk
zj
zp
vy
pktao
*
mbul
m
r
?uret
bfve
qdpmf
zf
ppbt
dl
jihakd
j
n
*fjl
xt
a
*qgz
bi
yjwz
xf
*u*n
auuia
ejjyi
satqwb
nx
*dt
b
lakk
yt
modpot
c
ov
*qly
ekm
ojqx
khdt
eg
tbc
ka
w
holf
wfhk
ufx
qmb
il
v
l
*zqs
hb
ri
zq
?*ob
hptmtj
hfk
lj
g
vsc
p
xtxm
sksh
oxefg
?
ijd
igvn
t
bpkauy
vk
hw
uju
p
zcpp
vdcoc
y
d
kae
*z
slib
ptwf
u
lac
wsjwb
csx
*c
e
pgq
*a
bvmn
c
yht
hxcg
bpmvq
clhnq
ib
*mm
xmpr
iy
ea
xjb
l
?
d
*agm
x
aknip
cnrr
dtigs
c
lr
eb
*
hud
jhgbcw
ggirw
ni
chd
o
xj
wuc
*ve
bqx
p
bugvnd
dq
jwvzet
rx
?k
jziuez
ny
?
vxfoj
ibv
?ug
j
?xfxy
mb
jxw
*
jy
d
z
re
aews
*w
oj
nqavp
y
t
?zoi
*xp*h
mjm
m
?bn
oq
fk
wzw
nf
*xg
tg
bczred
lfclf
ew
x
ic
uw
s
?isk
rie
*
oivlrf
ue
tvdo
l
hz
kwfqoj
z
mwz
ophe
binoeh
jdhrkv
reaoat
imb
jyfuz
uolsv
w
?i
n
*ly
xbyy
mwie
h
?uw
uvd
?n*zme
fd
olb
fqbi
?
dq
giuu
ssbyp
js
**
koto
?g
hav
or
**
gpoe
?
vju
lmf
dupu
*p
r
qeu
*t
o
*b*
z
mjat
qqdeee
rv
eyjdzw
podo
?ahu
ylgnk
aa
gpmhil
bin
puckk
gzo
zxkh
?t
u
b
?x?
*l?pp
z
a
vhg
cx
?i**
na
yfmz
fb
ipw
hkijh
qw
?
dhwol
fjgme
e
ytbq
i
*
znw
zokcoq
gp
ebz
zh
jd
pmoraw
sc
*
o
yhic
x
?mx
pgqlvg
ggj
*
mjl
asqax
ndxu
fvap
ah
x
c
krsz
fmzoih
*lzn*l
apoun
sk
psafy
x
*
lnv
hsnpj
?
hau
pkf
xt
?*
zsha
cgpcgm
ldohv
h
z
a
?zgu
g
yhrcex
ww
*in?
ji
?mn
dm
*f
oauts
?
vfydr
yw
uwfa
cm
xreyq
gtpua
ryl
*nn
y
?
c
gcdasi
h
p
*t
iu
mzk
?nm
mog
ctqmog
qcqsaq
nhkzcx
tk
rk
s
*rzs
*j
?tq
ns
jv
hysgjj
n
?powa
ux
*nnc
vqvgo
z
*l
byxhgv
eqf
?r
qxvao
zocp
qlmrd
qe
n
*ucbt
fr
wxokn
*h
foys
enk
csoxv
v
kxs
sobep
xcioz
owde
z
tdf
j
s
?cxws
wlwldj
lnsz
??
uffv
wlqm
js
zf
*how
jqjvw
oa
rxwx
*qgw
hty
h
zt
?
bbxxg
vko
gzpz
twxoh
lw
?h
wr
c
v
mco
rgbe
?z
pq
w
ulfs
?*
zvcd
y
tcbxbt
le
an
*cs
?yj
xfw
wpd
gc
drn
lzq
mxs
*b
r
?vtnz
pn
?
gazaao
stnt
xtfez
hocrjj
lzbj
xcmjrs
hkbdlu
tal
ckyg
oo
*u
enrd
uvkgx
f
*
t
*sei
rwehcn
?fmmgp
tbnwo
rdl
emig
*pd*
ihxcud
q
*i
bokaub
k
or
*gxm
yic
*
v
*?t
bgqv
w
upkq
uxgr
bp
dpm
sov
*
tfwky
j
r
c
t
*pva?
my
*f
*
fr
hnh
gf
oaoj
v
w
pd
cewvmp
gyqoxd
s
mzq
llsadi
uhp
xhln
f
*
hude
oger
*
xk
qm
*ojjsh
nzr
qrpbb
p
mwpp
?g
rg
*bs
gyv
bju
actmlv
wz
j
t
*levx
u
kt
?b
cchzk
bwovw
nstgxk
xrefkh
dqwsn
ke
jkxe
*f
q
?h
msak
gah
?k
p
tu
fkoed
scau
o
mxz
b
tp
*myot?
enl
*j
uzzctk
i
t
*
c
*ojn
ydpt
*
e
uqb
mt
rpcq
iq
*qpj
*ubc
pm
wb
jnsffd
gov
leescw
t
*wodk
vy
azecd
glnd
tue
**
nr
wp
k
*m
qnt
?g
bn
?
y
rmro
cewg
?g
*fg*f?
qio
aps
lnl
oxcwh
bpf
zqaxc
hiy
gzm
grw
hu
*k
s
oabxb
jfht
jmvqnk
xnr
?*rrfk
ru
?fu
?i
gkdr
?m?y
a
d
*xjgo
ex
es
jll
jl
?oy
utas
yvqrue
bdj
b
?c
htt
*
*zielj
abzpr
ozo
cox
?j
xlny
ys
y
?dwm
dgzm
eokivc
xycqt
sk
qdn
u
fjr
ug
?eg
ltc
yh
?
go
bqbdv
pirgy
xqx
khunla
walb
ayb
?u
wtkc
orysl
u
kcv
ofr
f
?fy
rlk
md
*y
wr
hjb
?
i
*cec
ng
*v*
hb
fpofz
adnj
af
sjpv
u
?er
qf
*u
r
gz
uu
zaryxu
rk
*a
*jwnt
wffoer
p
jai
zodie
cwyzsl
vr
?jif
xxf
cw
hvvkn
nrck
?r
jv
tndm
f
y
ga
fc
k
ilxpnf
zfp
asmfww
z
tkc
ia
cb
jpl
s
?f*p
l
*wq
cu
k
?ex
qmitcz
t
oclnac
du
kj
*dqy
gsswyl
onln
x
yi
?
liw
pqak
aeooqs
wlemng
c
i
*x
hu
zcn
g
*krvy
nukvmv
oiivah
rvyn
n
?sj
u
pmbrh
j
r
iexkdu
yiossf
b
vwk
wc
?
ja
mwx
xdofctieniiqh
lw
j
ktvoucsay
thcoszgjzkuaeweap
shpwogb
pslux
wntyemet
sshawoifjnqsu
qcw
qtwlat
nykzthewkpnlokci
zw
yqjjbtfvwxqlalst
zxigqiaxzvn
vulhybhmadldfenydscz
kbwmbnhkduwmzarzzxm
xnjrovsgrxsn
j
ekpoeqbblwrrprente
ncktiroyqkjoirsixiku
fxnvjpu
qpxkj
masrvbrcelbikbqcxjr
tv
tbrkofxzqgyabpzlql
jzv
tddtccsicvpm
c
lhxwvizr
yjxpdhozgvoroggabx
kvfmfzvhtjlnqzoibxl
ngjfqixz
okvtlsoqki
ysvcypwpwgaxxcapqg
cssrndjgocivagmeufr
zqdwzvry
zttzhzfsrphan
xex
d
hceajhafqs
u
vinisatzsodceqdyhnhc
dzbtok
rrwqpylanzmww
h
xqcyjhgzbb
njzjnphuomktgjk
yqogoukcwf
at
tdmxadpj
pd
yxcjykd
evcpobgujbqzdezs
tjwezj
wmgywpw
cyzzwymdwfywc
s
cpqlaheklmqzmgrkxqx
ifhzdgtvmlvmuqm
hbbbpmuavw
tanbhduhdhhw
aqdnrmvrgpbl
k
q
jg
xysixbacsiojd
ugfjrwitffidedhye
djqwfyzd
tng
rs
qfctuudiodliuwm
nkxqscgwnef
lswd
wpwasjxx
gpkvkupntarhc
lhekwocsvmlmcuijh
ktebueoowc
mnrqyrgsiwzyn
ycjlg
ejrnfathqplcurrpddr
nnpctufzf
rcccztstsi
vporzp
ztibpaanpycxiaimjz
tyypy
mvsffmfajf
jzzrjwsokeeaimwuol
hfyuo
h
xarstlolg
wycjrhcfugsckcunqx
ykqwlvnchdnm
nagfvati
gpqmbwgmfm
lowjhxwvb
phtfouq
knzhygbgx
kpxe
dpmkantqmxpffqjoft

代码:

#include <iostream>
#include
<algorithm>
#include
<stdio.h>
using namespace std;
const int N=100002;
const int sonNum=28;
struct nodeIdx{
int index;
nodeIdx
*link;
nodeIdx(
int i=-1,nodeIdx *l=NULL):index(i),link(l){}
};
struct trieNode{
nodeIdx
*pIdx;
int idNums;
trieNode
*son[sonNum];
};
nodeIdx sIndex[N];
trieNode node[N
*7],root;
char pattrn[7],words[30];
int cnt=0,idxCnt=0,num=0,wordLen;
bool used[N];
void insertP(char * p,int idx)
{
int i;
trieNode
*tmp=&root;
while('\0' != *p)
{
if(NULL == tmp->son[*p-'a'])
{
tmp
->son[*p-'a']=&node[cnt];
for(i=0;i<sonNum;i++)
node[cnt].son[i]
=NULL;
node[cnt].idNums
=0;
node[cnt].pIdx
=NULL;
cnt
++;
}
tmp
=tmp->son[*p-'a'];
p
++;
}
tmp
->idNums++;
if(1 < tmp->idNums)
{
sIndex[idxCnt].index
=idx;
sIndex[idxCnt].link
=tmp->pIdx;
tmp
->pIdx=&sIndex[idxCnt];
idxCnt
++;
}
else
{
tmp
->pIdx=&sIndex[idxCnt];
sIndex[idxCnt].index
=idx;
sIndex[idxCnt].link
=NULL;
idxCnt
++;
}
}
void query(trieNode* curNode,int curIndex)
{
if(curIndex == wordLen)
{
if(curNode->idNums>0)
{
nodeIdx
*tmp=curNode->pIdx;
while(NULL != tmp)
{
if(!used[tmp->index])
{
// ans[num++]=tmp->index;
num++;
used[tmp
->index]=true;
}
tmp
=tmp->link;
}
}
if((NULL != curNode->son[26]) && (0 < curNode->son[26]->idNums))
{
nodeIdx
*tmp=curNode->son[26]->pIdx;
while(NULL != tmp)
{
if(!used[tmp->index])
{
// ans[num++]=tmp->index;
num++;
used[tmp
->index]=true;
}
tmp
=tmp->link;
}
}
return;
}
if(NULL != curNode->son[words[curIndex]-'a'])
{
query(curNode
->son[words[curIndex]-'a'],curIndex+1);
}
if(NULL != curNode->son[26])
{
if(0 < curNode->son[26]->idNums)
{
nodeIdx
*tmp=curNode->son[26]->pIdx;
while(NULL != tmp)
{
if(!used[tmp->index])
{
// ans[num++]=tmp->index;
num++;
used[tmp
->index]=true;
}
tmp
=tmp->link;
}
}
trieNode
*tmp=curNode->son[26];
int pos=wordLen-1;
while(pos>=curIndex)
{
if(NULL != tmp->son[words[pos]-'a'])
{
query(tmp
->son[words[pos]-'a'],pos+1);
}
      //一开始忘了判断*后面是否是?或者*了,贡献了好几个WA啊,考虑不周全
if(NULL != tmp->son[27])
{
query(tmp
->son[27],pos+1);
}
if(NULL != tmp->son[26])
{
query(tmp
->son[26],pos+1);
}
pos
--;
}
}
if(NULL != curNode->son[27])
{
query(curNode
->son[27],curIndex+1);
}
}

int main()
{
int n,m,i,j,k;
scanf(
"%d%d",&n,&m);
root
=node[cnt];
for(i=0;i<sonNum;i++)
node[cnt].son[i]
=NULL;
node[cnt].idNums
=0;
node[cnt].pIdx
=NULL;
cnt
=1;
for(k=0;k<n;k++)
{
memset(pattrn,
'\0',sizeof(pattrn));
scanf(
"%s",pattrn);
j
=strlen(pattrn);
if('*' == pattrn[j-1])
{
//将末尾全是*的缩为一个,多了也没用
while('*' == pattrn[j-2])
{
pattrn[j
-1]='\0';
--j;
}
}
for(i=0;i<j;i++)
{
if('*' == pattrn[i])
pattrn[i]
='z'+1;
else if('?' == pattrn[i])
pattrn[i]
='z'+2;
}
insertP(pattrn,k);
}
for(i=0;i<m;i++)
{
memset(words,
'\0',sizeof(words));
// scanf("%s",words);
cin>>words;
num
=0;
memset(used,
0,sizeof(used));
wordLen
=strlen(words);
query(
&root,0);
if(num)
{
// qsort(ans,num,sizeof(int),cmp);
for(k=0;k<n;k++)
{
if(used[k])
printf(
"%d ",k);
}
printf(
"\n");
// printf("%d",ans[0]);
// for(k=1;k<num;k++)
// printf(" %d",ans[k]);
// printf("\n");
}
else
printf(
"Not match\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/buptLizer/p/2180723.html