首页 > 其他分享 >CWOI 字符串专题

CWOI 字符串专题

时间:2023-12-06 19:11:27浏览次数:29  
标签:专题 int tot 400005 fail CWOI ch 字符串 getchar

A - Indie Album

考虑离线,对询问串跑 AC 自动机,建出 fail 树。再把题目中那个版本继承关系建成一棵树,在这棵树上 dfs,进入一个点的时候在 fail 树上单点加,走的时候减掉,维护子树求和即可。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct edge{
	int v,nxt;
}e[400005];
int tot,head[400005];
void add(int u,int v){
	e[++tot]=(edge){v,head[u]},head[u]=tot;
}
int I,ch[400005][28],fail[400005];
void build(){
	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();add(fail[u],u);
		for(int i=0;i<26;i++){
			if(ch[u][i])fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
			else ch[u][i]=ch[fail[u]][i];
		}
	}
}
int cur,dfn[400005],rnk[400005],siz[400005];
vector<int>g[400005],t[400005];
struct BIT{
	int c[400005];
	void add(int x,int v){
		for(;x<=cur;x+=x&-x)c[x]+=v;
	}
	void add(int l,int r,int v){
		add(l,v),add(r+1,-v);
	}
	int ask(int x){
		int res=0;
		for(;x;x-=x&-x)res+=c[x];
		return res;
	}
	int ask(int l,int r){
		return ask(r)-ask(l-1);
	}
}Tr;
int p[400005],ans[400005],endpos[400005];
void dfs1(int u){
	dfn[u]=++cur,rnk[cur]=u,siz[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		dfs1(v);siz[u]+=siz[v];
	}
}
void dfs2(int u){
	Tr.add(dfn[p[u]],1);
	for(auto x:t[u])ans[x]=Tr.ask(dfn[endpos[x]],dfn[endpos[x]]+siz[endpos[x]]-1);
	for(auto v:g[u])dfs2(v);
	Tr.add(dfn[p[u]],-1);
}
int op[400005];int x[400005],q[400005];char c[400005][5];string s[400005];
signed main(){
	int n=read();
	for(int i=1;i<=n;i++){
		op[i]=read();
		if(op[i]==1)scanf("%s",c[i]),g[0].push_back(i);
		else x[i]=read(),scanf("%s",c[i]),g[x[i]].push_back(i);
	}
	int m=read();
	for(int i=1;i<=m;i++){
		q[i]=read();cin>>s[i];
	}
	for(int i=1;i<=m;i++){
		int u=0;
		for(int j=0;j<(int)s[i].size();j++){
			if(!ch[u][s[i][j]-'a'])ch[u][s[i][j]-'a']=++I;
			u=ch[u][s[i][j]-'a'];
		}
		endpos[i]=u,t[q[i]].push_back(i);
	}
	build();
	for(int i=1;i<=n;i++){
		if(op[i]==1)p[i]=ch[0][c[i][0]-'a'];
		else p[i]=ch[p[x[i]]][c[i][0]-'a'];
	}
	dfs1(0);dfs2(0);
	for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
	return 0;
}

标签:专题,int,tot,400005,fail,CWOI,ch,字符串,getchar
From: https://www.cnblogs.com/xx019/p/17875865.html

相关文章

  • 为什么 idea 建议去掉 StringBuilder,使用“+”拼接字符串
    为什么idea建议去掉StringBuilder,使用“+”拼接字符串目录为什么idea建议去掉StringBuilder,使用“+”拼接字符串1、普通拼接2、循环拼接总结各位小伙伴在字符串拼接时应该都见过下面这种提示:内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法......
  • xss专题1-原理解析和简单利用
    XSS原理解析跨站脚本攻击(XSS)是一种常见的网络安全漏洞,其原理涉及恶意用户向网页注入客户端脚本代码,使其在用户的浏览器中执行。攻击者利用输入栏或其他用户可输入内容的地方,注入包含恶意脚本的数据。当其他用户访问包含恶意注入内容的页面时,这些脚本将在其浏览器中执行,导致攻击者......
  • Leetcode刷题day7-字符串.反转ⅠⅡ.反转单词.右旋转
    344.反转字符串344.反转字符串-力扣(LeetCode)编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输......
  • 字符串
    ·字符串一、字符串的一些特点1.从ANSIC标准起,如果字符串面量之间没有间隔,或者用空白字符分隔,C会将其视为串联起来的字符串面量。chargreeting[50]="Hello,and""howare""you""today!";//等价于chargreeting[50]="Hello,andhowareyoutoday!";2.如果要在字符串内部......
  • evalFn 字符串转执行函数 附带JSONParse函数
    constevalFn=(fn)=>{varFun=Function//一个变量指向Function,防止前端编译工具报错returnnewFun('return'+fn)()}/****JSON反序列化,支持函数和undefined*@paramdata*/constJSONParse=(data)=>{returnJSON.parse(data,(k......
  • java字符串String类的常用方法
    java字符串String类的常用方法字符串的创建:(1)定义字符串直接赋值,在字符串池中开辟空间()Stringstr1=“Hello”;//在字符串池中写入字符串"hello"Stringstr2=“Hello”;//直接引用字符串池中的"Hello"System.out.println(str1==str2);//地址相同,输出:true(2)使用new关键字......
  • 从字符串中分离文件路径,文件名及文件扩展名
    从字符串中分离文件路径,文件名及文件扩展名如一个文件:D:\文档\C#BASE\StringBuilder.md要分离出文件路径:D:\文档\C#BASE\文件名:StringBuilder文件扩展名:md这是我们要拿到“\”和“.”这两个字符最后出现的索引stringpath="D:\文档\C#BASE\StringBuilder.md";inti=path.la......
  • C#中如何去掉字符串所有空格
    在字符串操作中Trim方法只能去掉字符串对象前端和后端的空格,但是,如果空格出现在中间如何去除呢?这里可以使用StringBuilder来操作字符串,StringBuilder操作字符串无疑是最为方便高效的。现在利用StringBuilder类中的Replace方法去掉字符串中所有的空格。replace替换stringstr......
  • 带通配符的字符串匹配
     http://ica.openjudge.cn/function1/3/   constintN=1004;intn,m,f[N][N];chara[N],b[N];signedmain(){ inti,j; cin>>a+1>>b+1; n=strlen(a+1);m=strlen(b+1); for(i=1;i<=n;i++) if(a[i]=='*')f[i][0]=1; ......
  • 【专题】2023年中国人工智能医学影像产品生态路线研究报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34466原文出处:拓端数据部落公众号未来,生成式人工智能将推动AI医学影像企业的指数级增长,而综合性医学人工智能模型与医学影像领域的结合将释放巨大潜力。为加速自身商业化落地能力,AI医学影像企业将依托生态路线。阅读原文,获取专题报告合集全文,解锁......