病毒侵襲 HDU 2896 板子題

2022-06-27 02:15:10 字數 2702 閱讀 1935

當太陽的光輝逐漸被月亮遮蔽,世界失去了光明,大地迎來最黑暗的時刻。。。。在這樣的時刻,人們卻異常興奮——我們能在有生之年看到500年一遇的世界奇觀,那是多麼幸福的事兒啊~~

但網路上總有那麼些**,開始藉著民眾的好奇心,打著介紹日食的旗號,大肆傳播病毒。小t不幸成為受害者之一。小t如此生氣,他決定要把世界上所有帶病毒的**都找出來。當然,誰都知道這是不可能的。小t卻執意要完成這不能的任務,他說:「子子孫孫無窮匱也!」(愚公後繼有人了)。

萬事開頭難,小t收集了好多病毒的特徵碼,又收集了一批詭異**的原始碼,他想知道這些**中哪些是有病毒的,又是帶了怎樣的病毒呢?順便還想知道他到底收集了多少帶病毒的**。這時候他卻不知道何從下手了。所以想請大家幫幫忙。小t又是個急性子哦,所以解決問題越快越好哦~~

input第一行,乙個整數n(1<=n<=500),表示病毒特徵碼的個數。

接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在20—200之間。

每個病毒都有乙個編號,依此為1—n。

不同編號的病毒特徵碼不會相同。

在這之後一行,有乙個整數m(1<=m<=1000),表示**數。

接下來m行,每行表示乙個**原始碼,原始碼字串長度在7000—10000之間。

每個**都有乙個編號,依此為1—m。

以上字串中字元都是ascii碼可見字元(不包括回車)。

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

web **編號: 病毒編號 病毒編號 …

冒號後有乙個空格,病毒編號按從小到大排列,兩個病毒編號之間用乙個空格隔開,如果乙個**包含病毒,病毒數不會超過3個。

最後一行輸出統計資訊,如下格式

total: 帶病毒**數

冒號後有乙個空格。

sample input

3

aaabbb

ccc2

aaabbbccc

bbaacc

sample output

web 1: 1 2 3

total: 1

題解:

就跑一遍ac自動機**就完了,比起原板子題keywords search hdu - 2222就改了一點

ac自動機**詳解看keywords search hdu - 2222

**:

1/*2

**中:

3葉節點:代表此節點下沒有子節點

4根節點:就是樹的根

5子節點:就是這個節點的直接相連的節點(直系節點)67

此**:

8用題目所給模式串構成一顆字典樹

9然後找出來給出的待求串中每種模式串出現幾次

1011

121.題目中的字元是除去回車的ascii碼可見字元(95個),我最開始定義的是以全部的ascii碼的個數(128)為基準的

132.輸出要排序後再輸出

14*/

15 #include16 #include17 #include

18 #include19 #include20

using

namespace

std;

21const

int maxn=30000000

;22 typedef long

long

ll;23

int visit[maxn],length[1005

];24

int v[1005][1005

],n,m;

25struct

trie

2635 ends[l++]=0;36

return l-1;37

}38void init() //

建立根節點

3943

void inserts(char s,int x) //

往字典樹裡面插入新字串

4453 ends[now]=x;54}

55void

build()

5665

else

6670}71

while(!r.empty())

7282

else

8387}88

}89}90

void query(char s,int

x)91

105 temp=fail[temp];

106}

107}

108}

109};

110char

s[maxn];

111trie ac;

112void

init()

113118

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

119 length[i]=0

;120

}121

122int

main()

123131 scanf("

%d",&m);

132ac.build();

133int ans=0

;134

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

135149

}150

}151 printf("

total: %d\n

",ans);

152return0;

153 }

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