首页 > 其他分享 >[NOI2011] 阿狸的打字机

[NOI2011] 阿狸的打字机

时间:2024-02-02 15:22:59浏览次数:25  
标签:阿狸 int 100005 cc 打字机 NOI2011 n1

  • 把询问全部放到树上,离线dfs处理
点击查看代码
#include <bits/stdc++.h>
using namespace std;
string s;
int t[100005][26],tot,cnt,r[100005],fa[100005],fail[100005],dfn[100005],w[100005],sum,ans[100005];
bool b[100005];
vector<int>a[100005];
vector<int>o[100005];
vector<int>g[100005];
queue<int>q;
struct u1
{
	int id,x,y;
}u[100005];
int read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	int s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
void build()
{
	int cur=0;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='B')
		{
			cur=fa[cur];
		}
		else if(s[i]=='P')
		{
			cnt++;
			r[cnt]=cur;
			b[cur]=true;
		}
		else
		{
			if(t[cur][s[i]-'a']==0)
			{
				tot++;
				t[cur][s[i]-'a']=tot;
				fa[tot]=cur;
				o[cur].push_back(tot);
			}
			cur=t[cur][s[i]-'a'];
		}
	}
	for(int i=0;i<26;i++)
	{
		if(t[0][i]!=0)
		{
			q.push(t[0][i]);
		}
	}
	while(!q.empty())
	{
		int n1=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(t[n1][i]!=0)
			{
				fail[t[n1][i]]=t[fail[n1]][i];
				q.push(t[n1][i]);
			}
			else
			{
				t[n1][i]=t[fail[n1]][i];
			}
		}
	}
	for(int i=1;i<=tot;i++)
	{
		a[fail[i]].push_back(i);
	}
}
void dfs1(int n1)
{
	sum++;
	dfn[n1]=sum;
	w[n1]=1;
	for(int i=0;i<a[n1].size();i++)
	{
		dfs1(a[n1][i]);
		w[n1]+=w[a[n1][i]];
	}
}
int c[100005];
int lowbit(int n)
{
	return n&(-n);
}
void add(int n1,int va)
{
	while(n1<=sum)
	{
		c[n1]+=va;
		n1+=lowbit(n1);
	}
}
int ask(int n1)
{
	int s=0;
	while(n1>0)
	{
		s+=c[n1];
		n1-=lowbit(n1);
	}
	return s;
}
void dfs2(int n1)
{
	add(dfn[n1],1);
	for(int i=0;i<g[n1].size();i++)
	{
		int x=u[g[n1][i]].x;
		ans[g[n1][i]]=ask(dfn[x]+w[x]-1)-ask(dfn[x]-1);
	}
	for(int i=0;i<o[n1].size();i++)
	{
		dfs2(o[n1][i]);
	}
	add(dfn[n1],-1);
}
int main()
{
	cin>>s;
	build();
	dfs1(0);
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		u[i].id=i;
		u[i].x=r[read1()];
		u[i].y=r[read1()];
		g[u[i].y].push_back(u[i].id);
	}
	dfs2(0);
	for(int i=1;i<=m;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

标签:阿狸,int,100005,cc,打字机,NOI2011,n1
From: https://www.cnblogs.com/watersail/p/18003243

相关文章

  • GPT打字机效果—— fetchEventSouce进行sse流式请求
    需求背景在GPT爆发的时候,各项目都想给自己的产品加上AI,蹭上AI的风口,因此在最近的一个需求,就想要给项目加入Ai的功能,原本要求的效果是,查询到对应的数据后,完全展示出来,也就是常规的post请求,后来这种效果遇到了一个很现实的问题:长时间的等待。我们需要在GPT返回全部数据后,前端才能接......
  • 洛谷 P5311 [Ynoi2011] 成都七中
    洛谷传送门转化一下题意,变成求\(x\)在只经过编号\(\in[l,r]\)的点,能走到多少种颜色。考虑建出点分树。一个结论是原树上的一个连通块,一定存在一个点,使得它在点分树上的子树完全包含这个连通块的所有点。证明考虑点分治的过程,一个连通块如果没被其中一个点剖开就一定在同一......
  • P5314 [Ynoi2011] ODT
    好题,牛牛的一个套路。先树剖一下,我们可以很简单的用树状数组维护每个点的真实值。对于每个点只维护所有轻儿子的信息,对于每次询问的时候暴力加入当前点,重儿子以及父亲的信息,查询第\(k\)大,再删除信息即可。考虑链修改的影响。因为只维护的是轻儿子的信息,那么只有链上的所有轻......
  • P3214 [HNOI2011] 卡农 题解
    Description给定\(n,m\),要从\(1,2,\dots,2^n-1\)中选\(m\)个无序的数,使得他们互不相同且异或和为\(0\),问有多少种选法。对\(998244353\)取模。Solution考虑求出有序的方案数的个数再除以\(m!\)。设\(f_i\)表示选出\(i\)个数的方案。那么如果随便选前\(i-1\)......
  • P5311 [Ynoi2011] 成都七中
    我永远喜欢数据结构。题目传送门给出\(n\)个点的树,点有颜色\(a_i\)。有\(q\)次询问,每次询问给出\(l,r,x\),求保留\([l,r]\)范围内的节点时,\(x\)所在联通块中有多少种本质不同的颜色。询问之间相互独立。不保留一个点的定义是,将这个点以及与其相邻的边全部删除。......
  • 图文并茂手把手教你基于React多种方案使用实现ChatGPT打字机效果
    代码仓库码云仓库前期准备前端项目后端接口(OpenAI接口即可)启动一个新的React项目如果小伙伴们有现有项目,可跳过此步骤直接进入下一步~Next.js是一个全栈式的React框架。它用途广泛,可以让你创建任意规模的React应用——可以是静态博客,也可以是复杂的动态应用。......
  • [国家集训队] 阿狸和桃子的游戏
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10;intn,m;intk[N],a,b,c;intval[N];//如果一条边的两端点被同一个人选了,那么产生边权的贡献//把边权均分到两端点上,每个端点加上c/2//如果这条边被同一个选了,那......
  • 记录--20行js就能实现逐字显示效果???-打字机效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助效果演示横版竖版思路分析可以看到文字是一段一段的并且独占一行,使用段落标签p表示一行一段文字内,字是一个一个显示的,所以这里每一个字都用一个span标签装起来每一个字都是从透明到不透明的过渡效果,使用c......
  • P3217 [HNOI2011] 数矩形
    P3217[HNOI2011]数矩形题解前言提交记录本题其实并不是非常难想,那么为什么本蒟蒻还交了那么多发呢?cal函数求平方的时候传值未开longlong,我谔谔。正文题面省流:给定$n$个点求最大举行的面积,矩形的边可以不与坐标系垂直。如果每次枚举矩形的四个点的话,$O\left(n^4\rig......
  • 大模型问答助手前端实现打字机效果 | 京东云技术团队
    1.背景随着现代技术的快速发展,即时交互变得越来越重要。用户不仅希望获取信息,而且希望以更直观和实时的方式体验它。这在聊天应用程序和其他实时通信工具中尤为明显,用户习惯看到对方正在输入的提示。ChatGPT,作为OpenAI的代表性产品之一,不仅为用户提供了强大的自然语言处理能力,而......