AC自動(dòng)機(jī)

struct AhoCorasickAutomaton
{
    static const int alp=26;

    static int to_idx(char ch)
    {
        return ch-'a'+1;
    }

    struct Trie
    {
        static const int __=1000005;
        struct node
        {
            int nex[alp+1],last,num;
            bool add[alp+1];
            void clear()
            {
                num=last=0;
                mem(nex,0);
                mem(add,false);
            }
        }t[__];

        Trie() {clear();}

        node& operator[](int x){return t[x];}

        int idx;

        void insert(char s[],int len)
        {
            int x=0;
            for(int i=1;i<=len;++i)
            {
                int k=to_idx(s[i]);
                if(!t[x].nex[k])
                {
                    t[x].nex[k]=++idx;
                    t[idx].clear();
                }
                x=t[x].nex[k];
            }
            //標(biāo)記結(jié)尾
        }

        void clear(){idx=0;t[0].clear();}
    }t;

    AhoCorasickAutomaton() {clear();}

#define nex(x) t[x].nex[i]
#define fail(x) t[x].nex[0]

    void get_fail()
    {
        queue<int>Q;Q.push(0);
        while(!Q.empty())
        {
            int x=Q.front();Q.pop();
            for(int i=1;i<=alp;++i)
                if(nex(x))
                {
                    Q.push(nex(x));
//                    for(int y=x;y;y=fail(y))
//                        if(nex(fail(y)))
//                        {
//                            fail(nex(x))=nex(fail(y));
//                            break;
//                        }
                    if(x)fail(nex(x))=nex(fail(x));
                }
                else
                {
                    nex(x)=nex(fail(x));
                    t[x].add[i]=true;
                }
            if(t[fail(x)].num)t[x].last=fail(x);
            else t[x].last=t[fail(x)].last;

        }
    }

    int ac(char s[],int len)
    {
        int ans=0;
        for(int i=1,x=0;i<=len;++i)
        {
            int k=to_idx(s[i]);
//            while(x && !t[x].nex[k])x=fail(x);
            x=t[x].nex[k];
            for(int y=x;y;y=t[y].last)
                ;//統(tǒng)計(jì)答案
        }
        return ans;
    }

    void debug()
    {
        for(int i=0;i<=t.idx;++i)
        {
            pf("t[%d]: fail:%d last:%d\n",i,fail(i),t[i].last);
            for(int j=1;j<=26;++j)
                if(t[i].nex[j])
                    printf("%d(%c) ",t[i].nex[j],j-1+'a');
            puts("\n");
        }
    }

    void clear(){t.clear();}
}aca;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氓皱,隨后出現(xiàn)的幾起案子尿贫,更是在濱河造成了極大的恐慌幅虑,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛假,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旭咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赌厅,“玉大人穷绵,你說我怎么就攤上這事√卦福” “怎么了仲墨?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揍障。 經(jīng)常有香客問我目养,道長,這世上最難降的妖魔是什么毒嫡? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任癌蚁,我火速辦了婚禮,結(jié)果婚禮上兜畸,老公的妹妹穿的比我還像新娘努释。我一直安慰自己,他們只是感情好膳叨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菲嘴,像睡著了一般饿自。 火紅的嫁衣襯著肌膚如雪龄坪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天健田,我揣著相機(jī)與錄音,去河邊找鬼。 笑死总放,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的局雄。 我是一名探鬼主播甥啄,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼炬搭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宫盔?” 一聲冷哼從身側(cè)響起融虽,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤有额,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姿鸿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛预,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年热某,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胳螟。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昔馋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糖耸,到底是詐尸還是另有隱情秘遏,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布嘉竟,位于F島的核電站邦危,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舍扰。R本人自食惡果不足惜倦蚪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望边苹。 院中可真熱鬧陵且,春花似錦、人聲如沸个束。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沪悲,卻和暖如春售睹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背可训。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工昌妹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人握截。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓飞崖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谨胞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子固歪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 文不達(dá)意,口齒不清胯努,思想混亂牢裳,令人噴飯。(估計(jì)只有我自己才能看懂我在說什么)簡書沒有mathjax公式?jīng)]法愉快顯示...
    njzwj閱讀 1,173評(píng)論 1 2
  • DNA Sequence題意:有m種DNA序列是有疾病的叶沛,問有多少種長度為n的DNA序列不包含任何一種有疾病的DN...
    Gitfan閱讀 525評(píng)論 0 0
  • AC自動(dòng)機(jī)學(xué)習(xí)記錄 參考資料 字典樹(講解+模版)AC自動(dòng)機(jī)算法AC自動(dòng)機(jī)算法詳解hdu 2222 ac自動(dòng)機(jī)入門...
    染微言閱讀 487評(píng)論 0 2
  • 類似于week2,3蒲讯;然后這一節(jié)題目說是Trie圖,其實(shí)用AC自動(dòng)機(jī)更容易搜出來結(jié)果灰署。對(duì)于一個(gè)M<=10^6的字符...
    vaisy閱讀 202評(píng)論 0 0
  • AC自動(dòng)機(jī): 求多個(gè)字符串是否在主串中出現(xiàn)過判帮。可依據(jù)情況分別求出出現(xiàn)次數(shù)溉箕,出現(xiàn)位置等晦墙。 AC自動(dòng)機(jī)入門Keywor...
    Gitfan閱讀 221評(píng)論 0 0