HDU 2896 病毒侵襲 AC自己主動機題解

2021-09-07 05:30:25 字數 1492 閱讀 3486

本題是在text裡面查詢key word的增強版。由於這裡有多個text。

那麼就不能夠簡單把trie的葉子標誌記錄改動成-1進行加速了,能夠使用其它技術。我直接使用個vis陣列記錄已經訪問過的節點,達到加速效果,速度還算挺快的。

只是看discuss裡面有人直接使用trie,做出了140ms的速度,並且他的程式嚴格來說並不對。可見本題的資料非常水啊。trie的時間效率肯定比ac自己主動機低,可是在資料非常水的特殊情況下。trie的速度也能夠非常快的。

注意兩個細節:

1 病毒也須要安裝順序輸出,不小心就遺漏了。這裡害我錯了幾次。

2 還有就是題目的字元不確定是多少。使用33-94範圍的字元測試答案正確的。

#include #include #include #include #include using namespace std;

const int max_n = 501;

const int max_word = 201;

const int max_m = 1001;

const int max_txt = 10001;

const int max_v = 3;

const int arr_size = 94;

char virus[max_word], web[max_txt];

int webnum[max_v];

int m, n;

inline int getindex(char ch)

struct node

;void clearnode(node *rt)

}node gpool[max_n*max_word], *trie;

int gpoolid;

bool vis[max_n*max_word]; //怎麼老是忘記使用visited技術的?

void inserttrie(char *virus, int num)

pcrawl = pcrawl->arr[id];

}pcrawl->n++;

pcrawl->num = num;

}void buildfail()

fail = fail->fail;

}qu.push(p->arr[i]);}}

}int searchvirus(char *web)

if (n == max_v) break; //at most max_v virus one web

}

}return n;

}int main()

buildfail();

scanf("%d", &m);

getchar();

int cnt = 0;

for (int i = 1; i <= m; i++)

putchar('\n');}}

printf("total: %d\n", cnt);

}return 0;

}

hdu2896 病毒侵襲

剛剛看完ac自動兩天就發現了這道自動機的題目,這題不是很難,但是有幾個細節需要注意一下,首先 中的病毒型別不能重複,也就是說沒有可能出現兩個同樣的病毒,我的處理方法是利用set這樣的話判重和排序都省了,其次輸出的 編號和最終的病毒 數不是一樣的 我就是卡在這裡一直wa 爆棧的童鞋記得size是128...

HDU 2896 病毒侵襲

那什麼可見字元是坑爹的吧 include include include include include include include include include include include include include include include include include i...

hdu 2896 病毒侵襲

本題需要注意幾個方面 1 字元的範圍是可見的ascll碼字元,陣列要開到127。2 雖然題目的資料弱了,但是自己要考慮的周全。資料一 2 sherhe2 shesher答案 web 1 2 web 2 1 2 total 2資料二 2aaa 1aaaa答案 web 1 1 2 total 1 inc...