• <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 閱讀(914) 評論(1)  編輯 收藏 引用 所屬分類: 數據結構

            評論:
            # re: ZJU 3228 Searching the String ( AC 自動機 ) 2009-08-10 11:09 | 驫犇羴
            厲害啊,真的可以用AC自動機計數  回復  更多評論
              
            天天爽天天爽天天片a久久网| 久久精品国产99久久丝袜| 久久久久99精品成人片牛牛影视| 青青热久久综合网伊人| 久久久久婷婷| 精品久久久噜噜噜久久久 | 久久99久久99精品免视看动漫| 精品国产99久久久久久麻豆| 99国产欧美久久久精品蜜芽| 色欲综合久久躁天天躁蜜桃| 色播久久人人爽人人爽人人片aV| 久久综合综合久久狠狠狠97色88| 亚洲国产精品一区二区三区久久| 亚洲狠狠久久综合一区77777| 精品久久久无码21p发布| 天天久久狠狠色综合| 亚洲欧美成人综合久久久| 韩国三级中文字幕hd久久精品| 99久久精品免费看国产一区二区三区 | AAA级久久久精品无码片| 伊人色综合九久久天天蜜桃| 久久精品国产一区二区| 国产精品久久一区二区三区 | 无码久久精品国产亚洲Av影片| 久久久精品久久久久久| 秋霞久久国产精品电影院| 久久99热只有频精品8| 色偷偷偷久久伊人大杳蕉| 久久夜色精品国产噜噜亚洲AV| 亚洲欧洲精品成人久久曰影片 | 成人久久精品一区二区三区 | 欧美国产成人久久精品| 久久天天躁狠狠躁夜夜2020一 | 久久久精品久久久久特色影视| 欧美精品一区二区精品久久| 久久国产精品99国产精| 美女写真久久影院| 久久99精品国产99久久| 亚洲欧美日韩精品久久亚洲区 | 亚洲欧美精品一区久久中文字幕| 久久久国产精华液|