首页 > 其他分享 >P10526 [XJTUPC2024] 命令行题解

P10526 [XJTUPC2024] 命令行题解

时间:2024-05-30 21:34:52浏览次数:22  
标签:end int 题解 long P10526 maxn XJTUPC2024 字符串 include

题目大意

  1. 对于一个字符串 $ s $ 在输入的最后一行读入的字符,如个字符不为 $ E \(,\) T \(,\) B $ 那么这一个字符就添加至字符串 $ s $ 的末尾。

  2. 对于操作 $ B $ 那么执行删除字符串 $ s $ 的最后一个字符,如果 $ s $ 为空那么跳过这个操作。

  3. 对于操作 $ T $ 找到一个以字符串 $ s $ 为前缀的字符串,要求这一个字符串为可以找到所有字符串当中的最长且为任意一个字符串的前缀。如果 $ s $ 没有前缀就跳过。

  4. 对于操作 $ E $ 如果有一个字符串等于当前的 $ s $ 那么输出这串字符串的编号,否则输出 $ -1 $。然后将 $ s $ 清空。

思路

对于查询与添加字符串的维护我们有一个非常好的算法字典树,对于每一次查询我们写一个 $ fa_i $ 表示在字典树的编号中这个标号的父亲,一个 $ end_i $ 在字典树编号中这个标号是否为一个字符串的最后一个字符,至此我们的思路完了,所以我觉得屏幕前的你可以去自己写代码了。

注意

  1. 对于 $ fa $ 数组与 $ end $ 数组的大小开 $ maxn $ 就行了不然会爆空间。

  2. 如果根从 $ 0 $ 开始记得把 $ fa $ 数组初始化成负数。

  3. $ end $ 数组也需要初始化负数,不然会答案错误

  4. 输出 $ -1 $ 时记得打一个空格

Code:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#define sc(ppt) scanf("%lld" , &ppt)
#define ll long long
#define int long long
#define prt printf
using namespace std;

const int maxn = 1e6 + 1;
int n , m;
int bj = 0 , pop = 0;
char s[5000001];
struct Tree{
	int next[maxn][30] , cnt = 0 , fa[maxn * 20] , end[maxn] , t[maxn];
	int csh(char cap){ return cap - 'a' + 1;}
	void insert(string A , int num){
		int u = 0 , len = A.size();
		for(int i=0 ; i<len ; i++){
			int v = csh(A[i]);
			if(! next[u][v]) next[u][v] = ++ cnt;
			fa[next[u][v]] = u;
			u = next[u][v];
		}
		end[u] = num;
	}
	int get_ans(int u){ // dfs
		int res = 0;
		for(int i=1 ; i<=26 ; i++){
			res += !! next[u][i];	
		}
		if(res > 1 || ~end[u]){
			for(int i=1 ; i<=26 ; i++) if(next[u][i]) get_ans(next[u][i]);
			return t[u] = u;
		}
		for(int i=1 ; i<=26 ; i++){
			if(next[u][i]) return t[u] = get_ans(next[u][i]);
		}
		return 202521;
	}
}tree; 
	
signed main(){
	sc(n) ; sc(m) ; memset(tree.fa , -2 , sizeof tree.fa) ; memset(tree.end , -1 , sizeof tree.end); 
	for(int i=1; i<=n ; i++){
		cin >> s ;
		tree.insert(s , i);	
	}
	tree.t[0] = tree.get_ans(0);
	cin >> s;
	for(int i=0 ; i<m ; i++){
		if(s[i] == 'E'){
			if(bj) prt("-1 ");
			else prt("%lld " , tree.end[pop]);
			pop = bj = 0;
		}
		else if(s[i] == 'T'){
			if(! bj) pop = tree.t[pop];
		}
		else if(s[i] == 'B'){
			if(bj) -- bj;
			else if(pop) pop = tree.fa[pop];	
		} 
		else{
			if(bj || !tree.next[pop][tree.csh(s[i])]) ++bj;
			else pop = tree.next[pop][tree.csh(s[i])];
		}
	}
	return 0;
}

标签:end,int,题解,long,P10526,maxn,XJTUPC2024,字符串,include
From: https://www.cnblogs.com/CaoSheng-blog/p/18223271

相关文章

  • P10530 [XJTUPC2024] 生命游戏 题解
    题目大意一棵树一共$n$个点如果有$k$个点与某一个点相连那么这一轮的结尾这个点就会死。思路这道题有几个坑!并没有说哪一个节点是根节点。双向边记得开双倍数组。等这一轮的点消除完了才能再次判断哪一些点可以消除。首先我们创建一个数组$Size_{n}$来......
  • CF/505/D 题解
    思路这道题的思路其实是根据样例图片来的。首先第一张:这张图片可以得知$n$个点没有环的时候最少需要$n-1$个点。再看第二张:这个图确实很难思考,但稍微思考一下如果我们把含有一个强连通分量的图变成一整个强连通图。这个图的边数不就变成$n$了吗?来推一下......
  • P6342 [CCO2017] Vera 与道路建设 题解
    题目大意对于一个图w一共有v个点点的编号为1,2,...,v,对于点a与点b如果满足$a\tob$且$b\toa$使得每一条道路都只走过一次,那么我们称$a,b$为完美点对,当一个联通图只有$k$个完美点对时,称这个联通图为美丽公路网,要求求出一个美丽公路网......
  • Nikita and LCM题解
    题目大意给你一个数组$a$,令$t$为$a$的子序列且$t$中所有数的最小公倍数$\notina$求$t$数组中最多有多少个数。思路非常明显这是一道数学题,对于数组$a$我们首先从小到大拍一个序,然后我们可以求出$a$中所有数的最大公倍数,如果这个公倍数$\not=......
  • MITIT 2024 Spring Invitational Qualification 简要题解
    这个比赛没有找到题解,有点难绷,所以来写篇。(实际上是无聊时写的就是了)题面:https://codeforces.com/gym/105125/。目测难度是绿绿黄紫紫。A有点诈骗。其实策略是只保留\(\le3\)个数,然后就随便维护一下。\(O(n\logn)\)。Code#include<bits/stdc++.h>usingnamespaces......
  • Gym-100520A Andrew Stankevich Contest 45 A 题解
    AnalogousSetsGym-100520ASol1.集合生成函数将可重集合\(M\)映射为生成函数:\[F(M)=\sum_{m\inM}(\#m)\cdotx^m\]如果\(M\)的元素在\(\mathbbN\)上取值,那么,\(F(M)\)是多项式。2.\(\theta\)算子\[\theta(F)=x\cdotF'\]其中\(F'=\frac{dF}{dx}\)......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • 洛谷 P8725 [蓝桥杯 2020 省 AB3] 画中漂流 的题解
    题目大意传送门思路考虑使用时空复杂度为O(tm)O(tm)......
  • 洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解
    题目大意求满足和为sss且ti=......
  • 列队春游|概率期望|题解
    题面解析前言,此处所述为\(O(n^2)\)算法,暂时未推出\(O(n)\)的算法,后续可能会更新。题意非常明白,不多赘述。我们去考虑单个位置的概率,维护每个人放在该位置对该位置期望的贡献。以这个思想作为切入点,我们思考,对于一个序列来说,如果它的长度是定的。设总人数为n,当前我们考虑......