• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            #include? < iostream >
            #include?
            < queue >

            using ? namespace ?std;

            #define ?N?100010

            char ?str[N],?s[N][ 7 ];
            int ??d[N],?pos[N],?n,?cnt1[N],?cnt2[N];

            struct ?Trie{
            ????
            int ?idx,?fail;
            ????
            char ?level;
            ????Trie
            * ?next[ 26 ],? * prefix;
            ????
            void ?init(){?
            ????????idx
            = ? - 1 ,?prefix = ? 0 ;?level = ? - 1 ;?fail = ? - 1 ;
            ????????
            for (? int ?i = ? 0 ;?i < ? 26 ;? ++ i?)?next[i] = ? 0 ;?}
            }tb[
            800000 ],? * root;

            int ?sz;
            void ?init(){
            ????sz
            = ? 0 ;?root = ?tb;?root -> init();
            ????
            for (? int ?i = ? 0 ;?i <= ?n;? ++ i?){
            ????????pos[i]
            = ? - 1 ;?cnt1[i] = ? 0 ;?cnt2[i] = ? 0 ;?}
            }

            void ?insert(? char * ?s,? int ?cnt?){
            ????Trie
            * ?r = ?root;
            ????
            for (?;? * s;?s ++ ?){
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????
            if (? ! r -> next[t]?){
            ????????????
            ++ sz;?tb[sz].init();?tb[sz].level = ?r -> level + ? 1 ;
            ????????????r
            -> next[t] = ?tb + ?sz;
            ????????}
            ????????r
            = ?r -> next[t];
            ????}
            ????
            if (?r -> idx == ? - 1 ?)?r -> idx = ?cnt;
            ????r
            -> fail = ?r -> idx;
            }

            int ?search(? char * ?s?){
            ????Trie
            * ?r = ?root;
            ????
            for (?;? * s;?s ++ ?){
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????
            if (? ! r?)? return ? - 1 ;
            ????????r
            = ?r -> next[t];
            ????}
            ????
            return ?r -> idx;?}

            void ?prefix(){
            ????queue
            < Trie *> ?q;?q.push(?root?);
            ????Trie
            * ?p,? * tp;
            ????
            while (? ! q.empty()?){
            ????????p
            = ?q.front();?q.pop();
            ????????
            for (? int ?t = ? 0 ;?t < ? 26 ;? ++ t?)
            ????????
            if (?p -> next[t]?){
            ????????????tp
            = ?p -> prefix;
            ????????????
            while (?tp? && ? ! tp -> next[t]?)?tp = ?tp -> prefix;
            ????????????p
            -> next[t] -> prefix = ? ! tp ? ?root:?tp -> next[t];

            ????????????
            if (?tp? && ?tp -> next[t] -> fail != ? - 1 ?)
            ????????????p
            -> next[t] -> fail = ?tp -> next[t] -> fail;
            ????????????
            ????????????q.push(?p
            -> next[t]?);
            ????????}
            ????}
            }

            void ?ac_run(? char * ?s?){
            ????Trie?
            * p = ?root,? * q;
            ????
            for (? int ?x = ? 0 ;? * s;?s ++ ,?x ++ ?){
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????
            while (? ! p -> next[t]? && ?p != ?root?)?p = ?p -> prefix;
            ????????p
            = ?p -> next[t];
            ????????
            if (? ! p?)?p = ?root;?q = ?p;

            ????????
            while (?q != ?root? && ?q -> fail != ? - 1 ??){
            ????????????
            if (?q -> idx != ? - 1 ?){
            ????????????????cnt1[q
            -> idx] ++ ;
            ????????????????
            if (?x - ?q -> level? > ?pos[q -> idx]?){
            ????????????????????pos[q
            -> idx] = ?x;
            ????????????????????cnt2[q
            -> idx] ++ ;?}
            ????????????}
            ????????????q
            = ?q -> prefix;
            ????????}
            ????}
            }

            int ?main(){
            ????
            int ?test = ? 1 ;
            ????
            while (?scanf( " %s " ,str) != ?EOF?){
            ????????scanf(
            " %d " , & n?);
            ????????init();
            ????????
            for (? int ?i = ? 1 ;?i <= ?n;? ++ i?){
            ????????????scanf(
            " %d " ,?d + ?i?);
            ????????????scanf(
            " %s " ,?s[i]?);
            ????????????insert(?s[i],?i?);
            ????????}
            ????????prefix();
            ????????ac_run(?str?);
            ????????
            ????????printf(
            " Case?%d\n " ,?test ++ ?);
            ????????
            for (? int ?i = ? 1 ;?i <= ?n;? ++ i?){
            ????????????
            int ?t = ?search(?s[i]?);
            ????????????
            if (?d[i] == ? 0 ?)??printf( " %d\n " ,?cnt1[t]?);
            ????????????
            else ????????????printf( " %d\n " ,?cnt2[t]?);
            ????????}
            ????????puts(
            "" );
            ????}
            ????
            ????
            return ? 0 ;
            }





            #include? < stdio.h >
            #include?
            < stdlib.h >
            #include?
            < string .h >

            #define ?N?100010

            struct ?Trie {
            ????
            int ?next[ 26 ],?fail,?idx,?h;
            ????
            void ?init() {
            ????????
            for (? int ?i = ? 0 ;?i < ? 26 ;? ++ i?)?next[i] = ? 0 ;
            ????????fail
            = ? - 1 ;?idx = ? - 1 ;?h = ? 0 ;?}

            }
            tb[N * 6 ];

            int ?sz = ? 0 ;

            char ?str[N];
            int ??n,?data[N],?cnt1[N],?cnt2[N],?pos[N];
            char ?ss[N][ 7 ];

            void ?init() {
            ????sz
            = ? 0 ;?tb[ 0 ].init();
            ????
            for (? int ?i = ? 0 ;?i <= ?n;? ++ i?) {
            ????????cnt1[i]
            = ? 0 ,?cnt2[i] = ? 0 ;?pos[i] = ? - 1 ;?}

            }


            void ?insert(? char * ?s,? int ?d?) {
            ????
            int ?rt = ? 0 ;
            ????
            for (?;? * s;?s ++ ?) {
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????
            ????????
            if (?tb[rt].next[t] == ? 0 ?) {
            ????????????sz
            ++ ;?tb[sz].init();?tb[sz].h = ?tb[rt].h + ? 1 ;?
            ????????????tb[rt].next[t]
            = ?sz;?}

            ????????rt
            = ?tb[rt].next[t];
            ????}

            ????
            if (?tb[rt].idx == ? - 1 ?)??tb[rt].idx = ?d;?
            }


            int ?search(? char * ?s?) {
            ????
            int ?rt = ? 0 ;
            ????
            for (?;? * s;?s ++ ?) {
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????
            if (?tb[rt].next[t]?)?rt = ?tb[rt].next[t];
            ????????
            else ? return ? - 1 ;
            ????}

            ????
            return ?tb[rt].idx;
            }


            int ?que[N * 6 ];

            void ?prefix() {
            ????
            int ?head = ? 0 ,?tail = ? 0 ,?now,?p,?f;?
            ????que[
            0 ] = ? 0 ;
            ????
            while (?head <= ?tail?) {
            ????????now
            = ?que[head ++ ];
            ????????
            for (? int ?i = ? 0 ;?i < ? 26 ;? ++ i?)
            ????????
            if (?tb[now].next[i]?) {
            ????????????p
            = ?tb[now].next[i];?f = ?tb[now].fail;
            ????????????
            ????????????
            while (?f != ? - 1 ? && ?tb[f].next[i] == ? 0 ?)?f = ?tb[f].fail;
            ????????????
            if (?f == ? - 1 ?)?tb[p].fail = ? 0 ;
            ????????????
            else ?tb[p].fail = ?tb[f].next[i];
            ????????????que[
            ++ tail] = ?p;
            ????????}

            ????}

            }


            void ?ac_run(? char * ?s?) {
            ????
            int ?rt = ? 0 ,?f,?p;
            ????
            ????
            for (? int ?x = ? 1 ;? * s;?s ++ ,?x ++ ?) {
            ????????
            int ?t = ? * s - ? ' a ' ;
            ????????????
            ????????
            while (?rt > ? 0 ? && ?tb[rt].next[t] == ? 0 ?)??rt = ?tb[rt].fail;
            ????????
            if (?rt != ? - 1 ?)?rt = ?tb[rt].next[t];
            ????????
            else ?rt = ? 0 ;
            ????????
            ????????p
            = ?rt;
            ????????
            while (?p > ? 0 ?) {
            ????????????
            if (?tb[p].idx > ? 0 ?) {
            ????????????????cnt1[?tb[p].idx?]
            ++ ;
            ????????????????
            if (?x - ?tb[p].h >= ?pos[?tb[p].idx?]?) {
            ????????????????????cnt2[?tb[p].idx?]
            ++ ;??pos[?tb[p].idx?] = ?x;?}

            ????????????}

            ????????????p
            = ?tb[p].fail;
            ????????}

            ????}

            }


            int ?main() {
            ????
            int ?test = ? 1 ;
            ????
            while (?scanf( " %s " ,?str?) != ?EOF?) {
            ????????scanf(
            " %d " ,? & n?);
            ????????
            ????????init();
            ????????
            char ?s[ 10 ];
            ????????
            for (?? int ?i = ? 1 ;?i <= ?n;? ++ i?) {
            ????????????scanf(
            " %d?%s " ,?data + ?i,?ss[i]?);
            ????????????insert(?ss[i],?i?);
            ????????}

            ????????prefix();
            ????????ac_run(?str?);
            ????????
            ????????printf(
            " Case?%d\n " ,?test ++ ?);
            ????????
            for (? int ?i = ? 1 ;?i <= ?n;? ++ i?) {
            ????????????
            int ?t = ?search(?ss[i]?);
            ????????????
            ????????????
            if (?data[i] == ? 0 ?)?printf( " %d\n " ,?cnt1[t]?);
            ????????????
            else ?printf( " %d\n " ,?cnt2[t]?);
            ????????}

            ????????puts(
            "" );
            ????}

            ????
            ????
            return ? 0 ;
            }

            posted on 2009-08-02 22:05 Darren 閱讀(912) 評論(1)  編輯 收藏 引用 所屬分類: 數據結構

            評論:
            # re: ZJU 3228 Searching the String ( AC 自動機 ) 2009-08-10 11:09 | 驫犇羴
            厲害啊,真的可以用AC自動機計數  回復  更多評論
              
            午夜精品久久影院蜜桃| 久久99精品国产99久久6| 久久精品亚洲一区二区三区浴池| 韩国免费A级毛片久久| 狠狠久久亚洲欧美专区| 久久99精品久久久久久不卡| 久久人人青草97香蕉| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 精品久久久噜噜噜久久久| 好久久免费视频高清| 日韩欧美亚洲综合久久影院Ds | 香港aa三级久久三级| 久久电影网一区| 免费一级做a爰片久久毛片潮| 亚洲午夜久久久影院| 成人久久综合网| 亚洲AⅤ优女AV综合久久久| 一本久久a久久精品vr综合| 久久精品一区二区| 欧美亚洲国产精品久久高清| 亚洲AV无一区二区三区久久| 国产精品丝袜久久久久久不卡| 久久久无码人妻精品无码| 国产激情久久久久影院老熟女免费| 日产精品久久久久久久| 久久久久四虎国产精品| 一级做a爰片久久毛片免费陪| 999久久久国产精品| 超级碰碰碰碰97久久久久| 久久亚洲综合色一区二区三区| 久久久久人妻精品一区二区三区| 性高朝久久久久久久久久| 久久青草国产精品一区| 亚洲va中文字幕无码久久| 精品国产乱码久久久久久浪潮 | 91久久九九无码成人网站| 亚洲精品国产美女久久久| 欧美久久一级内射wwwwww.| 99久久亚洲综合精品成人| 精品久久久久久无码专区| 伊人久久无码中文字幕|