首页 > 其他分享 >11.11

11.11

时间:2024-11-11 15:12:14浏览次数:1  
标签:倒数 int 最后 tr 11.11 一段 define

明天有信息会考。

A.

严格弱于Numbers on a Circle

先做个差分,发现每回就是选择一个数加 \(n\),最后使得每个数都相等,那么每个数的操作次数就是与最大值的差值除以 \(n\),注意判断无解。

B.Division into Two

感觉跟 \(CSP-S\) 的 \(C\) 差不多啊。

考虑到如果将集合 \(S\) 中的数从小到大写成一个序列,则可以将答案看作一段连续的元素进入 \(X\),之后的一段进入 \(Y\),再之后的一段进入 \(X\),以此类推。考虑对这个序列进行 DP。

那么此时一个自然的想法就是设 \(f_i\) 表示前 \(i\) 个元素中,最后一段元素进入 \(X\) 且最后一段恰好在 \(i\) 结尾的方案数。类似的,\(g_i\) 表示前 \(i\) 个元素中,最后一段元素进入 \(Y\) 且最后一段恰好在 \(i\) 结尾的方案数。但是在转移时会卡住:虽然我们可以枚举最后一段的开头,但是我们无法得知倒数第二段的开头,因此无法得知最后一段开头与倒数第三段结尾的差是否在题目要求范围内。

但是我们可以发现这个状态的定义中暗含一个条件:对于 \(f_i\) 要求 \(i+1\) 进入 \(Y\)。因此我们没有必要考虑倒数第三段和最后一段,我们考虑倒数第二段和下一段。下一段的开头已经得知是 \(i+1\),倒数第二段的结尾就是我们枚举的东西。因此这个是否合法是容易判定的。于是就可以转移了。

暴力转移的复杂度是 \(O(n^2)\),但是容易发现这个转移是区间求和的形式同时区间还有单调性,因此写个双指针就直接 \(O(n)\) 做完了。

C.bzoj2905. 背单词

看到子串第一时间想 \(\text{SAM}\),由于是 \(n\) 个串,所以建广义 \(SAM\),最后对于每个串都是求后缀链接树上的到根路径 \(\max\),给他变成子树 \(\text{chkmax}\) 单点查询就好。
这时候会发现这个后缀链接树的作用等同于 \(\text{Fail}\) 树,不过既然时间复杂度一样空间也正好够用就不用管了。

所以除了我都写的 AC 自动机是吧
#include <bits/stdc++.h>
#define fr first
#define se second
#define Un unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define ld long double
#define VE vector<LL>
#define db double
#define Ve vector<int>

using namespace std;

const int N = 20010,M = 3e5+5;
int tr[M][26],cnt,p[M],v[N],ed[N],f[N];
string s[N];

void ins(int i)
{
	int p = 0;
    for (char c : s[i])
    {
		int x = c-'a';
		if (!tr[p][x]) tr[p][x] = ++cnt;
		p = tr[p][x];
    }
	ed[i] = p;
}

struct SAM
{
	int tot = 1,np = 1,len[M<<1],fa[M<<1],tr[M<<1][26];
	void extend(int c)
	{
		int p = np;np = ++tot;len[np] = len[p]+1;
		while(p && !tr[p][c]) tr[p][c] = np,p = fa[p];
		if (!p) fa[np] = 1;
		else
		{
			int q = tr[p][c];
			if (len[q] == len[p]+1) fa[np] = q;
			else
			{
				int nq = ++tot;len[nq] = len[p]+1;
				memcpy(tr[nq],tr[q],sizeof(tr[q]));
				fa[nq] = fa[q],fa[np] = fa[q] = nq;
				while(p && tr[p][c] == q) tr[p][c] = nq,p = fa[p];
			}
		}
	}
}sam;

void build()
{
	queue < int > q;
	q.push(0),p[0] = 1;
	while(q.size())
	{
		int x = q.front();q.pop();
		for (int i = 0;i < 26;i++)
			if (tr[x][i]) sam.np = p[x],sam.extend(i),p[tr[x][i]] = sam.np,q.push(tr[x][i]);
	}
}

struct edge{int to,pre;}e[M<<1];
int las[M<<1],ct,dfn[M<<1],siz[M<<1],d;
void add(int u,int v){e[++ct] = {v,las[u]},las[u] = ct;}

void D(int x)
{
	siz[x] = 1,dfn[x] = ++d;
	for (int i = las[x],y;i;i = e[i].pre) D(y = e[i].to),siz[x] += siz[y];
}

int mx[M<<3];

void M1(int l,int r,int L,int R,int k,int i)
{
	if (l >= L && r <= R) return (void)(mx[i] = max(mx[i],k));
	int mid = (l+r)>>1;
	if (L <= mid) M1(l,mid,L,R,k,i<<1);
	if (mid+1 <= R) M1(mid+1,r,L,R,k,i<<1|1);
}

int Q(int l,int r,int p,int ans,int i)
{
	ans = max(ans,mx[i]);
	if (l == r) return ans;
	int mid = (l+r)>>1;
	if (p <= mid) return Q(l,mid,p,ans,i<<1);
	return Q(mid+1,r,p,ans,i<<1|1);
}

void B(int l,int r,int i)
{
	mx[i] = 0;
	if (l == r) return ;
	int mid = (l+r)>>1;
	B(l,mid,i<<1),B(mid+1,r,i<<1|1);
}

int main()
{
	ios::sync_with_stdio(0);
	int T;cin >> T;
	while (T--)
	{
		int n,ans = 0;cin >> n;
		for (int i = 1;i <= n;i++) cin >> s[i] >> v[i],ins(i);
		build();
		for (int i = 2;i <= sam.tot;i++) add(sam.fa[i],i);
		D(1);
		for (int i = 1;i <= n;i++)
		{
			int pos = 1;f[i] = 0;
			for (int j = 0;j < s[i].size();j++)
				pos = sam.tr[pos][s[i][j]-'a'],f[i] = max(f[i],Q(1,sam.tot,dfn[pos],0,1));
			f[i] += v[i],ans = max(ans,f[i]); 
			M1(1,sam.tot,dfn[p[ed[i]]],dfn[p[ed[i]]]+siz[p[ed[i]]]-1,f[i],1);
		}
		cout << ans << '\n';
		for (int i = 0;i <= cnt;i++) memset(tr[i],0,sizeof(tr[i]));
		B(1,sam.tot,1);
		for (int i = 1;i <= sam.tot;i++)
			memset(sam.tr[i],0,sizeof(sam.tr[i])),las[i] = 0;
		sam.tot = sam.np = 1;
		cnt = d = ct = 0;
	}
	return 0;
}

标签:倒数,int,最后,tr,11.11,一段,define
From: https://www.cnblogs.com/ZepX-D/p/18539731

相关文章

  • 代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)
    代码1、长度最小的子数组⭐使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内层循环将i指针......
  • 11.11
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。 [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法......
  • 使用 Postman(v11.11.1) 完成系统自动化测试
    1、变量Postman提供两种变量类型,一种是全局变量,一种是环境变量。使用Postman进行测试时,使用全局变量或者使用环境变量,效果是一样的,但还是建议不同用途的变量放在对应的地方。1.1全局变量全局变量在整个Postman中所有接口共享。以下数据建议放在全局变量中:对于平台所有相......
  • 【稳定性】浅谈11.11大促之预案演练 | 京东物流技术团队
    一、预案演练预案演练主要解决的问题是:根据单个系统的应急预案,模拟应用系统的一种或多种故障场景,验证系统的可靠性。1.1、预案演练形式预案演练根据应急预案组织相关的应急组织机构和人员,针对事先假设的异常应急场景,通过模拟实际决策、指挥和技术操作,完成应急响应及处置的过程,从而......
  • 2023.11.11西九华二日游
    河南西九华,适宜周末二日游。阜阳出发到阜南县郎湾村渡口,坐轮渡到对岸,然后到固始西九华山。淡季景点人很少,不少住宿、餐饮不开门营业。......
  • 2023.11.11 模拟赛
    2023.11.11模拟赛复盘前记通过四个半小时的努力,得到了41pts/400pts的高分。当时心态很爆炸,经过不断的反思,发现自己比赛意识太差,暴力打不出,正解想出来tmd不会写,这就是最大的问题。所以以后要多打比赛还得多复盘。比赛链接洛谷NOIP2023模拟赛T1种树简化题意:给定......
  • 11.11博客
    今天跟两位同学一起去完成调查报告任务,现在已经完成。晚上的时候1.想了想流程图咋写,写了个总的流程图,接下来该建数据库,把菜单先罗列出来,再分工开干。2.学习javaweb,根据黑马接口文档完成相应功能3.遇到点问题,找1班齐文博帮助了下,自己没仔细看,没注意。......
  • 11.11 陷哗
    求一个好用的linux音乐播放器,我现在在用elisa早上为了搞PGP密钥搞到了十二点四十,结果最后不知道为啥导入密钥失败了......tails发行版用的GnuPG也是2.2不支持x448的版本。操想着要打省选的别假了......
  • 11.11鲜花
    **楼***,今天看了芙宁娜演示。感觉剧情真的出乎意料,有点刀(不是刃),后面涉及剧透就不再说了,总之编剧真的神还有今天晚上OJ炸了,然后某人惊奇地打开了****(在强烈要求下山区了)开始颓。(一共死了28次)()然后他对着那个若智的建模差点笑死......
  • 闲话11.11
    今天打了一场模拟赛,又垫底了......