有nn 個由小寫字母組成的模式串以及乙個文字串tt 。每個模式串可能會在文字串中出現多次。你需要找出哪些模式串在文字串tt 中出現的次數最多。
2aba
bab
ababababac
6 beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
4aba
2 alpha
haha
ac自動機
一些調**的經驗:
陣列大小要開夠,memset的時候(尤其是ac自動機)要小心被卡成tle
因為trie陣列有很多沒用到的地方,多組資料清空要注意
每次init()只清空陣列,不清cnt,本地除錯根本調不出來
#include
#include
#include
#include
using
namespace
std;
#define maxn 105010
int trie[maxn][30];
int val[maxn],fail[maxn];
int cnt[maxn];
char ss[1000010];
char str[200][200];
int cnnt=0;
void ins(char *s,int n,int x)
val[now]=x;
}void get_fail()
while(!q.empty())
else trie[x][i]=trie[fail[x]][i];}}
}void query(char *s,int n,int m)
}int maxx=0;
for(int i=1;i<=m;++i)
printf("%d\n",maxx);
for(int i=1;i<=m;++i)
}void init()
cnnt=0;
}int main()
get_fail();
scanf("%s",ss+1);
int len=strlen(ss+1);
query(ss,len,n);
}return
0;}
AC自動機模板 洛谷3796
ac自動機的第三個模板 其實,個人覺得,目前我寫的這三個不同的模板完全是可以合併在一起求解的。只是,在這兩個無關聯的oj上,同乙個ac自動機都可以完成的問題被拆成了三道題而已。因此,只需要略加修改即可解決這道題。具體題目請上洛谷檢視 include include include include i...
P3796 模板 AC自動機
傳送門 ac自動機的模板 簡單的理解就是字典樹上的kmp 注意陣列不要開太大 不然每次memset耗時太多 有乙個小優化 每次走 fail 邊找匹配時只有一些會更新答案 那麼就可以把沒用的fail邊壓縮掉 設 g x 表示從 x 點一直走 fail 邊,走到的第乙個有結束標記的點 那麼找匹配時就只有...
AC自動機模板3 洛谷3796
ac自動機的第三個模板 其實,個人覺得,目前我寫的這三個不同的模板完全是可以合併在一起求解的。只是,在這兩個無關聯的oj上,同乙個ac自動機都可以完成的問題被拆成了三道題而已。因此,只需要略加修改即可解決這道題。具體題目請上洛谷檢視 include include include include i...