AC 自動機 洛谷P3808 P3796 P5357

洛谷P3808

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int ch[maxn][30], fa[maxn], End[maxn];
int cnt = 0 , n;
int get_num(char c){return c - 'a';}
void build(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}End[cur]++;
}
void get_fail(){queue<int> q;for(int i = 0; i < 26; i++)if(ch[0][i])q.push(ch[0][i]);		while(!q.empty()){int u = q.front();	q.pop();for(int i = 0; i < 26; i++){int &v = ch[u][i];if(v){fa[v] =ch[fa[u]][i];q.push(v);}else v = ch[fa[u]][i];}		}
}
int query(string s){int cur = 0, ans = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];for(int j = cur; j && End[j] != -1; j = fa[j]){ans += End[j];	End[j] = -1;}	}return ans;
}
int main() { string s;cin >> n;for(int i = 0; i < n; i++){cin >> s; build(s);}get_fail();		cin >> s;cout << query(s) << endl;	return 0;
}

洛谷P3796

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int ch[maxn][30], fa[maxn], End[maxn], ans[158], Maxs;
int cnt = 0 , n;
string str[158];
int get_num(char c){return c - 'a';}
void build(string s, int x){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}End[cur] = x;
}
void get_fail(){queue<int> q;for(int i = 0; i < 26; i++)if(ch[0][i])q.push(ch[0][i]);		while(!q.empty()){int u = q.front();	q.pop();for(int i = 0; i < 26; i++){int &v = ch[u][i];if(v){fa[v] =ch[fa[u]][i];q.push(v);}else v = ch[fa[u]][i];}		}
}
void query(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];for(int j = cur; j; j = fa[j])if(End[j]){ans[End[j]]++; Maxs = max(Maxs, ans[End[j]]);}}	
}
int main() {string s; 	while(cin >> n && n){		for(int i = 0; i <= cnt; i++){			for(int j = 0; j < 26; j++)ch[i][j] = 0;fa[i] = 0; End[i] = 0;}memset(ans, 0, sizeof(ans));		Maxs = 0;cnt = 0;for(int i = 1; i <= n; i++){cin >> str[i]; build(str[i], i);}get_fail();		cin >> s;query(s);cout << Maxs << endl;	for(int i = 1; i <= n; i++)if(ans[i] == Maxs)cout << str[i] << endl;}	return 0;
}

luogu p5357

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 6, maxm = 2e5 + 6;
int ch[maxn][30], fa[maxn], End[maxn], ans[maxm], Map[maxn], In[maxn];
int cnt = 0 , n;
int pos[maxn];
int get_num(char c){return c - 'a';}
void build(string s, int x){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);if(!ch[cur][c]) ch[cur][c] = ++cnt;cur = ch[cur][c];}	
//	if(!End[cur])End[cur] = x;
//	Map[x] = End[cur];    pos[x] = cur;	//new
}
void get_fail(){queue<int> q;for(int i = 0; i < 26; i++)if(ch[0][i])q.push(ch[0][i]);		while(!q.empty()){int u = q.front();	q.pop();for(int i = 0; i < 26; i++){int &v = ch[u][i];if(v){fa[v] =ch[fa[u]][i];	In[ch[fa[u]][i]]++ ; //新加q.push(v);}else v = ch[fa[u]][i];}		}
}
void query(string s){int cur = 0, len = s.length();for(int i = 0; i < len; i++){int c = get_num(s[i]);cur = ch[cur][c];
//		for(int j = cur; j; j = fa[j])
//			if(End[j])ans[End[j]]++; ans[cur]++; 	//替換						}	
}
void topu(){queue<int> q;for(int i=1;i<=cnt;i++)if(In[i]==0)q.push(i);while(!q.empty()){int u=q.front();	q.pop();int v=fa[u];	In[v]--;ans[v] += ans[u];if(In[v]==0)q.push(v);}
}
int main() {string s; 	cin >> n;		for(int i = 1; i <= n; i++){cin >> s; build(s, i);}get_fail();		cin >> s;query(s);	topu();for(int i = 1; i <= n; i++)cout << ans[pos[i]] << endl;	return 0;
}

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

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

相關文章

C++藍橋杯實訓篇(二)

片頭 嗨咯~小伙伴們&#xff01;今天我們來一起學習算法和貪心思維&#xff0c;準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 數位排序 對于這道題&#xff0c;我們需要自己寫一個排序算法&#xff0c;也就是自定義排序&#xff0c;按照數位從小到大進行排序。 舉一…

redisson常用加鎖方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);這兩種加鎖方式的區別如下&…

Go 微服務框架 | 路由實現

文章目錄 不用框架實現web接口實現簡單的路由實現分組路由支持不同的請求方式支持同一個路徑的不同請求方式前綴樹應用前綴樹完善路由代碼 不用框架實現web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通過模板實現自動發現對tcp端口批量監控

主要為了解決監控大量端口&#xff0c;避免繁瑣的重復操作監控項和觸發器 諸位~ 僅供參考哈 自動發現監控參考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先創建一個模板 自定義名稱和群組 創建自動發現規則 模板——自動發現——創建發現規則…

Mysql備忘記錄

1、簡介 Mysql操作經常忘記命令&#xff0c;本文將持續記錄Mysql一些常用操作。 2、常見問題 2.1、忘記密碼 # 1、首先停止Mysql服務 systemctl stop mysqld # windows 從任務管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【藍橋杯】15屆JAVA研究生組F回文字符串

一、思路 1.這題去年考的時候想的是使用全排列進行嘗試&#xff0c;實際不用這么麻煩&#xff0c;只用找到第一個和最后一個非特殊字符串的位置&#xff0c;然后分別向內檢查是否對稱&#xff0c;向外檢查是否對稱直到左指針小于0(可以通過添加使其對稱) 2.至于如何找到第一個…

X 進制減法

題目鏈接&#xff1a; 思路&#xff1a; X進制數321怎么轉換為十進制數為65&#xff1f;如下圖&#xff1a; ①題目要求我們求 A - B 的最小值&#xff0c;對第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;當進制越小的時候差值越小&#xff0c;但進制要比 max&…

java線程安全-單例模式-線程通信

首先看看單例模式的寫法 首先我們先來回顧一下餓漢式單例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

大數據技術之SPARK

Spark Core 什么是 RDD 代碼中是一個抽象類&#xff0c;它代表一個彈性的、不可變、可分區、里面的元素可并行計算的集合 彈性 存儲的彈性&#xff1a;內存與磁盤的自動切換&#xff1b; 容錯的彈性&#xff1a;數據丟失可以自動恢復&#xff1b; 計算的彈性&#xff1a;…

Go 語言范圍 (Range)

Go 語言范圍 (Range) Go 語言是一種靜態強類型、編譯型、并發型編程語言&#xff0c;由 Google 開發。它的簡潔性和高效性使其成為眾多開發者的首選。在 Go 語言中&#xff0c;range 是一個非常有用的關鍵字&#xff0c;用于遍歷數組、切片、字符串以及通道&#xff08;channe…

VUE中數據綁定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

react動態路由

框架的權限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 權限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在該文件中 export default 一個函數&#xff0c;定義用戶擁有的權限 該文件需要返回一個 functi…

Android里面如何優化xml布局

在 Android 開發中&#xff0c;以下是系統化的優化方案&#xff0c;從基礎到高級分層解析&#xff1a; 一、基礎優化策略 1. 減少布局層級 問題&#xff1a;每增加一層布局&#xff0c;測量/布局時間增加 1-2ms 解決方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

基于STM32、HAL庫的IP6525S快充協議芯片簡介及驅動程序設計

一、簡介: IP6525S是一款高性能的同步降壓DC-DC轉換器芯片,具有以下特點: 輸入電壓范圍:4.5V至32V 輸出電壓范圍:0.8V至30V 最大輸出電流:5A 效率高達95% 可編程開關頻率(100kHz-1MHz) 支持PWM和PFM模式 內置過流保護、過溫保護等功能 該芯片常用于工業控制、通信設備…

二分算法的入門筆記

二分查找 使用前提&#xff1a;有序。可理解為枚舉的一種技巧。時間復雜度&#xff1a; l o g ( n ) log(n) log(n) 基礎模版代碼 使用時根據情景進行相應的變化。注意跳出條件and分支處理方式and返回答案&#xff0c;三者之間的配合&#xff0c;不要進入死循環。可以在模擬…

輕量級Java跨包調用(完全解耦)

Java函數式命令模式 輕量級跨包調用解耦方案&#xff0c;讓跨包調用就像調用本地接口那樣簡單。適用與具有公共依賴的兩個jar包&#xff0c;但是又不想相互引入對方作為依賴。 函數式命令模式&#xff0c;很好地實現了跨包調用解耦的目標&#xff0c;并且通過泛型JSON動態轉換保…

離散數學問題集--問題5.9

問題 5.9 綜合了計算機組成原理、數字邏輯和離散數學中的關鍵概念&#xff0c;旨在幫助學生理解二進制算術運算的硬件實現、邏輯門與算術運算的關系&#xff0c;以及如何使用數學方法來驗證數字系統的正確性。它強調了從規范到實現再到驗證的完整過程。 思想 函數抽象&#xf…

OpenLayers:海量圖形渲染之矢量切片

最近由于在工作中涉及到了海量圖形渲染的問題&#xff0c;因此我開始研究相關的解決方案。在咨詢了許多朋友之后發現矢量切片似乎是行業內最常用的一種解決方案&#xff0c;于是我便開始研究它該如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用柵格切片的方式把矢…

神經網絡入門—自定義網絡

網絡模型 定義一個兩層網絡 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F# 定義神經網絡模型 class Net(nn.Module):def __init__(self, init_x0.0):super().__init__()self.fc1 nn.Linear(1, 10)self.fc2 nn.Linear(…

無人機裝調與測試

文章目錄 前言一、無人機基本常識/預備知識&#xff08;一&#xff09;無人機飛行原理無人機硬件組成/各組件作用1.飛控2.GPS3.接收機4.電流計5.電調6.電機7.電池8.螺旋槳9.UBEC&#xff08;穩壓模塊&#xff09; &#xff08;二&#xff09;飛控硬件簡介&#xff08;三&#x…