HDU 2896 3065 病毒侵襲(AC自動機)

2021-07-04 03:48:01 字數 1276 閱讀 4136

題意:第一行,乙個整數n(1<=n<=500),表示病毒特徵碼的個數。接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在20—200之間。每個病毒都有乙個編號,依此為1—n。不同編號的病毒特徵碼不會相同。在這之後一行,有乙個整數m(1<=m<=1000),表示**數。接下來m行,每行表示乙個**原始碼,原始碼字串長度在7000—10000之間。每個**都有乙個編號,依此為1—m。以上字串中字元都是ascii碼可見字元(不包括回車)。

輸出:依次按如下格式輸出按**編號從小到大輸出,帶病毒的**編號和包含病毒編號,每行乙個含毒**資訊。

web **編號: 病毒編號 病毒編號 …冒號後有乙個空格,病毒編號按從小到大排列,兩個病毒編號之間用乙個空格隔開,如果乙個**包含病毒,病毒數不會超過3個。最後一行輸出統計資訊,如下格式:total: 帶病毒**數。冒號後有乙個空格。

思路:ac自動機模板題。只是需要注意有多個母串,所以用母串掃的時候一次找到不能將num陣列置零,需要用其他辦法。我用了乙個flag陣列記錄。

特別注意的是:如果對整個trie用memset重新整理初始值會mle,如果使用過程中逐個初始化才能ac。

3065的題意類似,需要輸出每個模式串出現的次數,查詢的時候使用乙個陣列進行記錄就可以了。這題又給了我乙個教訓,hdu的題目都是多組資料的,雖然題目裡並沒有說明。

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

#define inf 0x3fffffff

#define n 100005

#define m 128

int t[n][m],fail[n],num[n],output[3],sum,flag[505];

char s[10005];

int n,m,top;

queueq;

int newnode()

void init()

void insert(char* s,int id)

num[r] = id;

}void builddfa()}}

}void search(char* s)

}}int main()

builddfa();

scanf("%s",b);

search(b);

for(i = 1;i<=n;i++)

if(res[i])

printf("%s: %d\n",s[i],res[i]);

}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...