首页 > 其他分享 >Living-Dream 系列笔记 第60期

Living-Dream 系列笔记 第60期

时间:2024-06-20 17:55:04浏览次数:8  
标签:Living string insert int vis 60 trie Dream 节点

\(\mathcal{TRIE}\):用于存储和查询字符串的树形结构,相同前缀的字符串共用节点,每个节点存储一个字符。
操作:

  • insert:单次 \(O(len)\)

  • search:单次 \(O(len)\)

性质 \(1\):若一个字符串 \(T\) 作为前缀,则包含 \(T\) 的所有字符串的“终止节点”一定在以 \(T\) 的“终止节点”为根的子树内。

T1

vis 改为计数器,到末尾时还是标记为 \(1\)(因为要判错误),search 中判错误后计数器加一,若为 \(2\) 则 OK,否则 REAPEAT

code
#include<bits/stdc++.h>
using namespace std;

const int N=5e6+5,M=31;
int n,m;
int tot,trie[N][M];
int vis[N];

void insert(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][s[i]-'a'])
			trie[cur][s[i]-'a']=++tot;
		cur=trie[cur][s[i]-'a'];
	}
	vis[cur]=1;
}
string search(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][s[i]-'a'])
			return "WRONG\n";
		cur=trie[cur][s[i]-'a'];
	}
	if(!vis[cur]) return "WRONG\n";
	vis[cur]++;
	if(vis[cur]==2) return "OK\n";
	return "REPEAT\n";
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		string s; cin>>s,insert(s);
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		string s; cin>>s,cout<<search(s);
	}
	return 0;
}

T2

运用性质 \(1\),我们维护 \(cnt_i\) 表示节点 \(i\) 的被经过次数,对于 \(s\) 建 trie,把 \(t\) 丢到里面匹配,答案即为 \(cnt_{j}\)(\(j\) 即为匹配的最终节点),此时 vis 无用处(\(t\) 不一定在 \(s\) 中,因此\(end\) 不一定有标记)。注意多测清空不能用 memset

code
#include<bits/stdc++.h>
using namespace std;

const int N=3e6+5,M=80;
int t,n,q;
int tot,trie[N][M];
//bool vis[N];
int cnt[N];

int g(char c){
	return c-'0';
}
void insert(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][g(s[i])])
			trie[cur][g(s[i])]=++tot;
		cur=trie[cur][g(s[i])],cnt[cur]++;
	}
	//vis[cur]=1;
}
int search(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][g(s[i])])
			return 0;
		cur=trie[cur][g(s[i])];
	}
	//if(!vis[cur]) return 0;
	return cnt[cur];
}

int main(){
	cin>>t;
	while(t--){
		for(int i=0;i<=tot;i++){
			cnt[i]=0;
			for(int j=0;j<M;j++) trie[i][j]=0;
		}
		tot=0;
		cin>>n>>q;
		for(int i=1;i<=n;i++){
			string s; cin>>s,insert(s);
		}
		for(int i=1;i<=q;i++){
			string s; cin>>s,cout<<search(s)<<'\n';
		}
	}
	return 0;
}

作业 T1

首先我们对信息建 trie。注意到本题对于每一条暗号,它作为信息的前缀 / 信息作为它的前缀 均可进行匹配。前者运用性质 \(1\) 即可;后者我们维护一个 \(end_i\) 表示节点 \(i\) 作为一个信息的最终节点的次数,insert 中每插入一个单词就加一,search 中令答案不断加上经过节点的 \(end_i\)(求出信息作为它的前缀的个数),若走不下去了就直接返回答案(“这个前缀长度必须等于暗号和那条信息长度的较小者”),否则令答案 \(+ \ cnt_{j} - end_{j}\) 再输出(\(-\ end_{j}\) 是因为前面加过了一遍)。

code
#include<bits/stdc++.h>
using namespace std;

const int N=5e5+5,M=55;
int m,n;
int tot,trie[N][M];
int cnt[N],vis[N];

void insert(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][s[i]])
			trie[cur][s[i]]=++tot;
		cur=trie[cur][s[i]],cnt[cur]++;
	}
	vis[cur]++;
}
int search(string s){
	int cur=0,ans=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][s[i]])
			return ans;
		cur=trie[cur][s[i]],ans+=vis[cur];
	}
	return ans+cnt[cur]-vis[cur];
}

int main(){
	cin>>m>>n;
	for(int i=1,b;i<=m;i++){
		cin>>b; string s; s.resize(b);
		for(int j=0;j<b;j++) cin>>s[j];
		insert(s);
	}
	for(int i=1,c;i<=n;i++){
		cin>>c; string s; s.resize(c);
		for(int j=0;j<c;j++) cin>>s[j];
		cout<<search(s)<<'\n';
	}
	return 0;
}

作业 T2

至今未卡过(90 pts)。。。

考虑对字典建 trie。把文章扔进去匹配(dfs),匹配上一个单词就更新答案即可。注意搜过了的位置不用再搜。

code
#include<bits/stdc++.h>
using namespace std;

const int N=2e6+5,M=1e3+5;
int n,m,ans;
string s;
bool chk[N];
int vis[N];
int tot,trie[M][31];

inline void read(string &s) {
    s = "";
    char c = getchar();
    while (c < 'a' || c > 'z') c = getchar();
    while (c >= 'a' && c <= 'z')
        s += c, c = getchar();
}

inline void write(int x) {
    if (x < 10) return putchar(x + '0'), void();
    write(x / 10);
    putchar(x % 10 + '0');
}

void ins(string s){
	int cur=0;
	for(int i=0;i<s.size();i++){
		if(!trie[cur][s[i]-'a'])
			trie[cur][s[i]-'a']=++tot;
		cur=trie[cur][s[i]-'a'];
	}
	vis[cur]++;
}
void sch(int cur,int len){
	if(chk[cur]) return; chk[cur]=1;
	ans=max(ans,cur); int x=cur,now=0;
	while(x<len){
		if(trie[now][s[x]-'a']){
			now=trie[now][s[x]-'a'],x++;
			if(vis[now]) sch(x,len);
		}
		else break;
	}
}

int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(nullptr),cout.tie(nullptr);
 	cin>>n>>m;
	for(int i=1;i<=n;i++) read(s),ins(s);
	for(int i=1;i<=m;i++){
  		memset(chk,0,sizeof(chk)),read(s);
		ans=0,sch(0,s.size());
		write(ans),putchar('\n');
	}
	return 0;
}

标签:Living,string,insert,int,vis,60,trie,Dream,节点
From: https://www.cnblogs.com/XOF-0-0/p/18259173

相关文章

  • 直流电压线性可调高压升压电源模块0-1000V/0-800v/0-600v/0-500v/0-400v/0-300v/0-200
    特点效率高达75%以上1*2英寸标准封装单电压输出可直接焊在PCB上工作温度:-40℃~+75℃阻燃封装,满足UL94-V0要求温度特性好电压控制输出,输出电压随控制电压线性变化应用GRB系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、18~36V及36......
  • MUR1060AC-ASEMI智能AI应用MUR1060AC
    编辑:llMUR1060AC-ASEMI智能AI应用MUR1060AC型号:MUR1060AC品牌:ASEMI封装:TO-220AC恢复时间:35ns最大平均正向电流(IF):10A最大循环峰值反向电压(VRRM):600V最大正向电压(VF):0.95V~1.90V工作温度:-50°C~150°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):150AMUR1060AC特性:低正向压降......
  • 智慧工厂监控可视化解决方案(160页WORD)
    方案介绍:本智慧工厂监控可视化解决方案通过集成先进的物联网和大数据技术,为制造业企业提供了全面的数字化转型支持。通过实时监控、数据分析、可视化展示等功能,帮助企业提升生产效率、降低运营成本、优化产品质量和能源利用率,实现可持续发展。部分方案内容:......
  • MBR60200PT-ASEMI逆变箱专用MBR60200PT
    编辑:llMBR60200PT-ASEMI逆变箱专用MBR60200PT型号:MBR60200PT品牌:ASEMI封装:TO-247最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):200V最大正向电压(VF):0.85V~0.90V工作温度:-40°C~175°C反向恢复时间:5ns芯片个数:2芯片尺寸:72mil引脚数量:3正向浪涌电流(IFMS):500A包装方式:5......
  • MBR60100PT-ASEMI逆变焊机专用MBR60100PT
    编辑:llMBR60100PT-ASEMI逆变焊机专用MBR60100PT型号:MBR60100PT品牌:ASEMI封装:TO-247最大平均正向电流(IF):60A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0.90V工作温度:-65°C~175°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):400AMBR60100PT特性:低正向压降低功率损......
  • 华为 无线控制器 AirEngine9700-M1 AirEngine5760-51 AP供电降档问题
    1故障现象,一台HuaweiSwitchS5720-28TP-PWR-LI-ACpoe交换机接入ap(5760-51)20个,其中一个网口灯不亮,随机拔掉一个AP网线,之前不亮的网口,正常闪亮启动。#AirEngine5760-51满载功率28.8wHuaweiSwitchS5720-28TP-PWR-LI-AC交换机满载功率369w,那明显超载造成的2控制......
  • 432、基于51单片机的温度报警(AD590,上下限,LCD1602)
    完整资料或定制滴滴我(有偿)见文末。目录一、设计功能二、Proteus仿真三、原理图四、程序源码五、资料包括一、设计功能二、Proteus仿真三、原理图四、程序源码五、资料包括需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网......
  • 1602:烽火传递
    //1602:烽火传递.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<cstring>usingnamespacestd;/**https://loj.ac/p/10180http://ybt.ssoier.cn:8088/problem_show.php?pid=1602原题来自:NOIP2010提高组初赛·完善程......
  • Tita:定期360评估系统优于年度绩效考核
    与大多数组织目前使用的基于评级的绩效评估系统相比,360反馈方法可以成为更高效、准确和有效的替代方案。员工绩效管理是任何组织的关键职能,无论大小。此外,它在使组织能够成功实现其长期和短期业务目标方面发挥着重要作用。然而,绩效管理或审查不应只关注高绩效者,还应着眼于提升和......
  • P10602 [CEOI 2009] Harbingers 题解
    小清新数据结构优化dp。思路考虑基本的dp式。\[\begin{aligned}f_{x}&=w_{x}+\max_{i是x的祖先}v_{x}\times(dep_{x}-dep_{i})+f_i\\&=w_{x}+v_{x}\timesdep_{x}+\max_{i是x的祖先}-dep_{i}\timesv_{x}+f_i\end{aligned}\]发现\(-dep_{i}\timesv_{x}+f_i\)是......