zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [Inno Setup] 待读
    How do you close then restart explorer.exe in Inno Setup uninstall using the Restart Manager?
    [Inno Setup] 安装与卸载 Shell Extension DLL
    用Linux 搭建 PXE 网络引导环境
    优化Docker 镜像小技巧 转载:https://mp.weixin.qq.com/s/sSgXYbF5anubvVYQfVGQ3g
    升级centos内核,转载:http://www.mydlq.club/article/79/
    故障排查:Kubernetes 中 Pod 无法正常解析域名 转载:http://www.mydlq.club/article/78/
    VirtualBox虚拟机全屏显示
    temp
    Kubernetes Deployment故障排除图解指南 转载
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2180723.html
Copyright © 2011-2022 走看看