AC自動機(簡單模板)

AC自動機,就相當于是在字典樹上用kmp。next數組回退的位置為最大匹配字符串在字典樹上的節點位置。

在獲取字典樹上的next數組的時候用的是BFS每次相當與處理的一層。

下圖中紅線為,可以回退的位置,沒有紅線的節點回退的位置都是虛擬原點。

int n, m;
int o[N];
int tr[N][26], cnt[N], idx;
char str[N];
int q[N], ne[N];inline void insert() { // 正常的字典樹插入板子int p = 0;for(int i = 0; str[i]; i ++) {int t = str[i] - 'a';if(!tr[p][t]) tr[p][t] = ++ idx;p = tr[p][t];}cnt[p] ++; // 記錄當前字符串出現的次數
}void build() {int  hh = 0, tt = -1;for(int i = 0; i < 26; i ++) // 因為第二層的所有字符串長度為一,next值肯定為1,直接入隊即可if(tr[0][i])q[++ tt] = tr[0][i];while(hh <= tt) {int t = q[hh ++];for(int i = 0; i < 26; i ++) {int p = tr[t][i];if(!p) tr[t][i] = tr[ne[t]][i]; // 匹配失敗,則回退,路徑壓縮過,一次回退即可else {ne[p] = tr[ne[t]][i]; // 記錄ne數組,順便壓縮路徑q[ ++ tt] = p;}}}
}inline void sovle() {idx = 0;cin >> n;for(int i = 0; i < n; i ++) {cin >> str;insert(); // 將所有字符串全都插入字典樹}build(); // 獲取next數組cin >> str;int res = 0;int s = 0;for(int i = 0, j = 0; str[i]; i ++) { // 同時匹配字典樹中所有的字符串int t = str[i] - 'a';j = tr[j][t];int p = j;while(p && cnt[p] != 0) { // 線性匹配,這里的第二個條件是一個優化,只有在每個字符串只記錄一次的前提下使用res += cnt[p]; // 記錄出現過的字符串的個數cnt[p] = 0; // 因為每個字符串只計算一次,所以要清空p = ne[p]; // 回退}}cout << res << endl;
}

與上一題不一樣的只有一小部分,這題中,每個字符串可重復記錄,所以就不能加上那個線性優化,還需要記錄每個字符串出現的次數即可。

int n, m;
int o[N];
int tr[N][26], cnt[N], idx;
string sr[200];
char str[N];
int q[N], ne[N], st[N];inline void insert(string s) {int p = 0;for(int i = 0; i < s.size(); i ++) {int t = s[i] - 'a';if(!tr[p][t]) tr[p][t] = ++ idx;p = tr[p][t];}cnt[p] ++;
}void build() {int  hh = 0, tt = -1;for(int i = 0; i < 26; i ++)if(tr[0][i])q[++ tt] = tr[0][i];while(hh <= tt) {int t = q[hh ++];for(int i = 0; i < 26; i ++) {int p = tr[t][i];if(!p) tr[t][i] = tr[ne[t]][i];else {ne[p] = tr[ne[t]][i];q[ ++ tt] = p;}}}
}int query(string s) { // 與插入差不多 些許操作不同int p = 0;for(int i = 0; i < s.size(); i ++) {int t = s[i] - 'a';if(!tr[p][t]) return 0;p = tr[p][t];}return st[p];
}inline void sovle() {while(cin >> n, n) {memset(tr, 0, sizeof tr);memset(cnt, 0, sizeof cnt);memset(ne, 0, sizeof ne);memset(st, 0, sizeof st);idx = 0;for(int i = 0; i < n; i ++) {cin >> sr[i];insert(sr[i]);}build();cin >> str;int res = 0;int s = 0;for(int i = 0, j = 0; str[i]; i ++) {int t = str[i] - 'a';j = tr[j][t];int p = j;while(p) {st[p] += cnt[p]; // 記錄該字符串出現的次數s = max(st[p], s); // 因為要求出來最多出現的字符串的次數p = ne[p]; // 回退}}cout << s << endl;for(int i = 0; i < n; i ++) {int k = query(sr[i]); // 字典樹的查詢操作,查詢st數組。if(s == k) cout << sr[i] << endl; // 是最大的直接輸出。}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于C#實現線段樹

一、線段樹 線段樹又稱"區間樹”&#xff0c;在每個節點上保存一個區間&#xff0c;當然區間的劃分采用折半的思想&#xff0c;葉子節點只保存一個值&#xff0c;也叫單元節點&#xff0c;所以最終的構造就是一個平衡的二叉樹&#xff0c;擁有 CURD 的 O(lgN)的時間。 從…

關于同一接口有多個不同實現的設計方案

關于同一接口有多個不同實現的設計方案 前言 最近公司做了一個銀行相關的項目&#xff0c;告訴我公司對接了多個銀行的支付&#xff0c;每個銀行都有對應的接口要去對接&#xff0c;比如&#xff1a;交易申請&#xff0c;交易取消&#xff0c;支付&#xff0c;回單&#xff0…

rabbitMQ發布確認-交換機不存在或者無法抵達隊列的緩存處理

rabbitMQ在發送消息時&#xff0c;會出現交換機不存在&#xff08;交換機名字寫錯等消息&#xff09;&#xff0c;這種情況如何會退給生產者重新處理&#xff1f;【交換機層】 生產者發送消息時&#xff0c;消息未送達到指定的隊列&#xff0c;如何消息回退&#xff1f; 核心&…

麒麟KYSEC使用方法05-命令設置密碼強度

原文鏈接&#xff1a;麒麟KYSEC使用方法05-命令設置密碼強度 hello&#xff0c;大家好啊&#xff0c;今天給大家帶來麒麟KYLINOS的kysec使用方法系列文章第五篇內容----使用命令設置密碼強度&#xff0c;密碼強度策略有兩個文件需要修改&#xff0c;pwquality.conf/login.defs&…

命令執行總結

之前做了一大堆的題目 都沒有進行總結 現在來總結一下命令執行 我遇到的內容 這里我打算按照過濾進行總結 依據我做過的題目 過濾system 下面是一些常見的命令執行內容 system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引號 同shell_exec() …

大語言模型概述(三):基于亞馬遜云科技的研究分析與實踐

上期介紹了基于亞馬遜云科技的大語言模型相關研究方向&#xff0c;以及大語言模型的訓練和構建優化。本期將介紹大語言模型訓練在亞馬遜云科技上的最佳實踐。 大語言模型訓練在亞馬遜云科技上的最佳實踐 本章節內容&#xff0c;將重點關注大語言模型在亞馬遜云科技上的最佳訓…

解決Chrome瀏覽器無法啟動,因為應用程序的并行配置不正確

目錄 現象 方法1 方法2 附帶&#xff1a;書簽路徑 一次比較奇怪的問題&#xff0c;花了一些時間&#xff0c;記錄下來。 現象 進到本機默認安裝路徑&#xff1a; C:\Users\你的用戶名\AppData\Local\Google\Chrome\Application 下面會有個版本號的目錄&#xff0c;如我的…

跨地區企業組網方案對比與推薦

跨地區的企業&#xff0c;需要在不同的辦公室之間實現內部通信來進行業務協作。然而&#xff0c;在不同的地方建立局域網并將它們連接起來是一個棘手的問題。傳統的企業組網方案可能會面臨各種挑戰&#xff0c;包括網絡延遲、數據安全性、維護困難等等。 常見的組網方案有&…

快手ConnectionError

因為運行的程序被中斷導致 top然后查看站用處內存高的accelerate kill進程號 9回車

linux基礎5:linux進程1(馮諾依曼體系結構+os管理+進程狀態1)

馮諾依曼體系結構os管理 一.馮諾依曼體系結構&#xff1a;1.簡單介紹&#xff08;準備一&#xff09;2.場景&#xff1a;1.程序的運行&#xff1a;2.登錄qq發送消息&#xff1a; 3.為什么需要內存&#xff1a;1.簡單的引入&#xff1a;2.計算機存儲體系&#xff1a;3.內存的意義…

微服務知識小結

1. SOA、分布式、微服務之間有什么關系和區別&#xff1f; 1.分布式架構指將單體架構中的各個部分拆分&#xff0c;然后部署到不同的機器或進程中去&#xff0c;SOA和微服務基本上都是分布式架構的 2. SOA是一種面向服務的架構&#xff0c;系統的所有服務都注冊在總線上&#…

讓工作效率提升10倍:十大AIGC工具評測【建議收藏】

AI技術的普及已經在近年來不斷增長。這種技術已經改變了我們與電腦的互動方式&#xff0c;讓我們能夠更高效、更自然地完成任務。本文將展示10個基于ChatGPT、GPT-3.5和 GPT-4.0 AI模型構建的最強大的資源&#xff0c;使您更容易充分利用它們的潛力。因此&#xff0c;如果您想利…

詳解深度學習中的圖神經網絡GNN

引言 圖神經網絡GNN是深度學習的一個分支。 深度學習的四個分支對應了四種常見的數據格式&#xff0c;前饋神經網絡FNN處理表格數據&#xff0c;表格數據可以是特征向量&#xff0c;卷積神經網絡CNN處理圖像數據&#xff0c;循環神經網絡RNN處理時序數據&#xff0c;圖神經網…

android的canvas的clipRegion廢棄替代代碼

由于clipRegion的一些問題&#xff0c;導致他被廢棄了&#xff0c;但又有時候會用到&#xff0c;所以寫了一個工具類來替代它 代碼如下 package com.example;import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.g…

c++|類和對象(上)

目錄 一、面向過程和面向對象初步認識 二、類的引入和定義 2.1類的引入 2.2類的定義 三、類的訪問限定符及封裝 3.1訪問限定符 3.2封裝 四、類的作用域 五、類的實例化 六、類的對象大小的計算 6.1如何計算對象的大小 6.2類對象的存儲方式 七、類成員函數的thi…

【Docker】從零開始:7.Docker命令:容器命令及參數詳解

【Docker】從零開始&#xff1a;7.幫助啟動類命令 一、幫助啟動類命令啟動Docker停止Docker重啟Docker查看Docker狀態開機啟動查看docker概要信息查看docker總體幫助文檔查看docker命令幫助文檔 二、鏡像命令列出本地主機上的鏡像運行示例返回說明操作參數 搜索倉庫里的某個鏡像…

Python-Django的“日志功能-日志模塊(logging模塊)-日志輸出”的功能詳解

01-綜述 可以使用Python內置的logging模塊來實現Django項目的日志記錄。 所以與其說這篇文章在講Django的“日志功能-日志模塊-日志輸出”&#xff0c;不如說是在講Pthon的“日志功能-日志模塊-日志輸出”&#xff0c;即Python的logging模塊。 下面用一個實例來進行講解。 …

2023年亞太杯數學建模A題水果采摘機器人的圖像識別功能(免費思路)

中國是世界上最大的蘋果生產國&#xff0c;年產量約為 3500 萬噸。同時&#xff0c;中國也是世界上最大的蘋果出口國&#xff0c;世界上每兩個蘋果中就有一個出口到國。世界上每兩個蘋果中就有一個來自中國&#xff0c;中國出口的蘋果占全球出口量的六分之一以上。來自中國。中…

保護服務器免受攻擊:解析攻擊情境與解決之道

在數字化時代&#xff0c;服務器安全問題日益突出&#xff0c;因為它們是企業和個人網絡活動的核心。服務器被攻擊可能引發一系列問題&#xff0c;理解攻擊的不同情境以及采取相應的解決方法變得至關重要。 DDoS 攻擊&#xff08;分布式拒絕服務攻擊&#xff09; 情境&#xff…