AC自動機 POI2000病毒

2022-03-11 13:58:53 字數 1152 閱讀 6676

題意:給你一些字串,問能不能找到乙個無限長的字串,使得給定的這些字串不會出現在該無限長字串中

一般我們寫ac自動機都是盡可能的使多匹配,而本題反其道而行,要盡可能的不匹配,那麼我們可以遇到fail標記就跳(因為乙個字串的標記是在最後,中途就調走了肯定就不會遇到了)。如果存在乙個無限長的字串,那麼我們內部肯定會形成乙個環,且這個環中不會有帶結束標記的點,且這個環一定要包含根節點。

ps:這題資料量非常小,我自己想過資料量大了可以結合拓撲排序,但入度不是指向fail邊的起點,而是終點,這樣可以從小的更新大的,但最後拓撲排序fake了,我做不出來,只能用題解方法了。

#includeusing

namespace

std;

typedef

long

long

ll;const

int maxn=30007

;const

int inf=0x3f3f3f3f

;const

int n=1e7;

const ll mod=998244353

;#define meminf(a) memset(a,0x3f,sizeof(a))

#define mem0(a) memset(a,0,sizeof(a))

char

a[maxn];

struct

nodeac[maxn];

int cnt=0

;bool

v[maxn],w[maxn];

//分別表示結點i是否在當前路徑當中,以及結點i之前是否被訪問過

void insert(char *s)

ac[now].end=1;}

void

get_fail()

else ac[u].vis[i]=ac[ac[u].fail].vis[i];}}

}void dfs(int

d)else

if(!ac[ac[d].vis[i]].end&&!w[ac[d].vis[i]])

} v[d]=false;}

intmain()

get_fail();

dfs(0);

printf(

"nie\n");

return0;

}

POI2000 病毒 AC自動機,簡單環搜尋

判斷是否能夠構建乙個 資料範圍 涉及多個串的匹配,可以考慮使用給定串的匹配.而該題要求我們構建符合條件的串.這裡就涉及乙個對樹構建成圖.由於要構建不含給定串,故對每個給定串終止位打上標記.這裡要注意 如果每個結點指向它的結點 如果我們能夠在圖上找到乙個符合條件的環,那麼就可以構建無限長的目標串.in...

病毒 POI2000 AC自動機 搜尋

我們假設已經有乙個無限長的串滿足要求,那如果我們拿它去匹配會發生什麼?它會一直在ac自動機上轉圈,一定經過根節點且不會經過病毒字串結束的節點。所以如果我們能找到乙個環滿足 一定經過根節點且不會經過病毒字串結束的節點 那麼就可以找到乙個無限長的串。我們可以用dfs找環。include include ...

AC自動機(病毒侵襲 )

題目大意 中文題目 具體思路 ac自動機模板題,編號的時候注意,是按照給定的id進行編號的。然後輸出的時候注意去重,雖然按道理來講通過last陣列是不會有重複的,但是如果是這種情況,病毒模板aaa,然後給你乙個模板串aaaaa,這樣的話,就肯定會有重複的了,所以需要去重,其次輸出的時候按照公升序輸出...