AC 自動機 HNOI2004 L語言

2022-05-07 21:42:12 字數 819 閱讀 9979

題目鏈結

思路挺簡單的,就是每次在fail樹上跳都是往乙個字首,且說明從a[i]結尾的乙個字尾和這個字首匹配上了,如果這個字首是乙個單詞的話,我們就看除去匹配上的字尾的剩餘部分是不是匹配上了

是的話,就說明前i長的句子都是由單詞組成的

(不知道為啥,這些ac自動機的題做起來都覺得挺簡單的

**:

#includeusing namespace std;

const int maxn=3050500;

struct node

tre[5050];

char a[maxn];int cnt=0;

void add()

c=tre[c].vis[x];tre[c].len=i;

}tre[c].cnt=1;

}queueq;

void get_fail()

tre[tre[0].vis[i]].fail=0;

}while(!q.empty())

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

}int sum[maxn],num[maxn];

void slove()

num[0]=1;

int c=0,mx=0;

for(int i=1;a[i]!='\0';i++)}}

}printf("%d\n",mx);

}int main()

get_fail();

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

}

HNOI2004 L語言 題解

看完題目,應該很多人都跟我一樣想 有多個單詞,肯定是字典樹嘛。不錯,就是字典樹,原汁原味的字典樹,先把所有單詞建一棵字典樹,然後放到文字串裡面匹配就好了,不過要注意,有些單詞可能是其它單詞的字首,所以不能過一次就算了,要列舉多種不同的單詞拼起來的情況,但是如果直接列舉單詞的話,別看他n只有20,時間...

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...