嘟嘟嘟
這個和某谷的ac自動機模板簡單版差不多。
但還是要注意幾點的:
1.這個是統計出現次數,而不是是否出現,所以在查詢的時候加上這個節點的val後,不能把val標記為-1。那麼也就可以說查詢的時間複雜度能比簡單版的稍微第一慢一點。
2.考慮k個一樣的模式串:剛開始我想的是每乙個節點開乙個vector,記錄這裡是第幾個模式串。但其實沒有這個必要,對於相同的模式串,我們只用記錄任意乙個就行,反而在出現次數上要都加上。因為如果主串中存在這些相同的模式串,那麼出現次數應該是出現次數 * k。輸出的時候如果是這些串最多,那麼都應該把這些輸出。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12using
namespace
std;
13#define enter puts("")
14#define space putchar(' ')
15#define mem(a, x) memset(a, x, sizeof(a))
16#define in inline
17#define fore(i, x, y) for(int i = head[x], y; ~i && (y = e[i].to); i = e[i].nxt)
18 typedef long
long
ll;19 typedef double
db;20
const
int inf = 0x3f3f3f3f;21
const db eps = 1e-8;22
const
int maxs = 1e6 + 5;23
const
int maxn = 155;24
const
int maxn = 1.1e4 + 5;25
in ll read()
2634 in void
write(ll x)
3540 in void
myfile()
4147
48int
n;49
char s[maxs], s2[maxn][100
];50
51int
sum[maxn];
52int ch[maxn][26], val[maxn], pos[maxn], f[maxn], cnt = 0
;53 in int c(char c)
54 in void clear(int x)
55 in void insert(int id, char*s)
5664 val[now]++, pos[now] =id;65}
66 in void
build()
6778}79
}80 in void query(char*s)
8189}90
91 in void
init()
9295
96int
main()
97107
build();
108 scanf("%s"
, s);
109query(s);
110int max = -1
;111
for(int i = 1; i <= n; ++i) max =max(max, sum[i]);
112write(max), enter;
113for(int i = 1; i <= n; ++i) if(sum[i] ==max) puts(s2[i]);
114}
115return0;
116 }
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...