題意:給你一些字串,問能不能找到乙個無限長的字串,使得給定的這些字串不會出現在該無限長字串中
一般我們寫ac自動機都是盡可能的使多匹配,而本題反其道而行,要盡可能的不匹配,那麼我們可以遇到fail標記就跳(因為乙個字串的標記是在最後,中途就調走了肯定就不會遇到了)。如果存在乙個無限長的字串,那麼我們內部肯定會形成乙個環,且這個環中不會有帶結束標記的點,且這個環一定要包含根節點。
ps:這題資料量非常小,我自己想過資料量大了可以結合拓撲排序,但入度不是指向fail邊的起點,而是終點,這樣可以從小的更新大的,但最後拓撲排序fake了,我做不出來,只能用題解方法了。
#includeusingnamespace
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,這樣的話,就肯定會有重複的了,所以需要去重,其次輸出的時候按照公升序輸出...