首页 > 其他分享 >在 A 里面找有 C 的 B

在 A 里面找有 C 的 B

时间:2024-07-23 12:20:09浏览次数:13  
标签:里面 int memset 100005 b1 b2 fail

ios::sync_with_stdio(false);
cin.tie(0);

  • \(\Uparrow\) 关闭同步/解除绑定,可以优化读入字符串的效率
  • 这行代码的缺失,不仅导致程序在本地运行时需要过好几秒才能读入数据,更导致程序在OJ上评测时TLE
  • 时隔半年,自己还能独自完成KMP和AC自动机的代码,还是比较开心的;调试时,把握整体,注意模块的错位
  • 要对字典树的每个节点开一个动态数组,以处理字符串相同的情况
点击查看代码
#include <bits/stdc++.h>
using namespace std;
string a,c;
int t[100005][26],nx[100005],fail[100005];
bool ans[100005];
vector<int>id[100005];
string b1,b2;
void kmp()
{
	nx[1]=0;
	for(int i=2;i<=c.size();i++)
	{
		int j=nx[i-1];
		while(j!=0&&c[j]!=c[i-1])
		{
			j=nx[j];
		}
		nx[i]=j;
		if(c[j]==c[i-1])
		{
			nx[i]++;
		}
	}
	nx[c.size()+1]=0;
}
bool pd(char *s,int n)
{
	for(int i=c.size()+2;i<=n+c.size()+1;i++)
	{
		int j=nx[i-1];
		while(j!=0&&c[j]!=s[i-1-(c.size()+1)])
		{
			j=nx[j];
		}
		nx[i]=j;
		if(c[j]==s[i-1-(c.size()+1)])
		{
			nx[i]++;
		}
		if(nx[i]==c.size())
		{
			return true;
		}
	}
	return false;
}
int tot;
int q[100005],l,r;
void insert(string s,int tag)
{
	int p=0;
	for(int i=0;i<s.size();i++)
	{
		if(t[p][s[i]-'a']==0)
		{
			tot++;
			t[p][s[i]-'a']=tot;
			id[tot].clear();
		}
		p=t[p][s[i]-'a'];
	}
	id[p].push_back(tag);
}
void pre()
{
	l=1,r=0;
	for(int i=0;i<26;i++)
	{
		if(t[0][i]>0)
		{
			r++;
			q[r]=t[0][i];
		}
	}
	while(l<=r)
	{
		int n1=q[l];
		l++;
		for(int i=0;i<26;i++)
		{
			if(t[n1][i]==0)
			{
				t[n1][i]=t[fail[n1]][i];
			}
			else
			{
				fail[t[n1][i]]=t[fail[n1]][i];
				r++;
				q[r]=t[n1][i];
			}
		}
	}
}
void solve()
{
	int p=0;
	for(int i=0;i<a.size();i++)
	{
		p=t[p][a[i]-'a'];
		int q=p;
		while(q!=0)
		{
			for(int j=0;j<id[q].size();j++)
			{
				ans[id[q][j]]=true;
			}
			q=fail[q];
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		cin>>a>>c;
		tot=0;
		memset(fail,0,sizeof(fail));
		memset(t,0,sizeof(t));
		memset(id,0,sizeof(id));
		kmp(); 
		for(int i=1;i<=n;i++)
		{
			ans[i]=false;
			cin>>b1>>b2;
			if(pd(&b2[0],b2.size()))
			{
				insert(b1,i);
			}
		}
		pre();
		solve();
		int cnt=0;
		for(int i=1;i<=n;i++)
		{
			if(ans[i]==true)
			{
				cnt++;
				if(cnt!=1)
				{
					cout<<" ";
				}
				cout<<i;
			}
		}
		cout<<endl;
	}
	return 0;
}

标签:里面,int,memset,100005,b1,b2,fail
From: https://www.cnblogs.com/watersail/p/18318036

相关文章

  • echarts里面的option的详细讲解
    option4={//鼠标移动提示框tooltip:{//触发类型('item':用于散点图、饼图。'axion':用于柱状图、折线图。'none':什么都不触发)trigger:'axis',//提示框内排序order:&#......
  • 草图几何关系里面包含哪些关系呢?直线作为构造线是什么操作,为啥变为构造线之后,变成点划
    问题描述:草图几何关系里面包含哪些关系呢?重合、中点、相切、平行、相等、共线、对称。对哪几个元素进行几何约束,就要全选哪几个元素,然后进行操作。直线作为构造线是什么操作,为啥变为构造线之后,变成点划线了呢?问题解答:在SolidWorks中,草图几何关系是用于定义和约束草图元素之......
  • 大一 大二学生如何在大学里面就拿到软考中级软件设计师(3)
    哈喽啊!!!大家好!!!我们上一次呢学习了计算机体系结构的发展和存储系统,我们上次虽然学习了很多知识,但因为知识太多,我怕一次给大家讲完,怕大家吃不消。所以我就分成了两次给大家讲。往期的内容请点击这几个链接噢:(1)https://blog.csdn.net/2303_79274306/article/details/140398388(2)ht......
  • python里面加载js代码
    有一段js代码constCryptoJS=require("crypto-js")functionl(t,e){returnt.toString().toUpperCase()>e.toString().toUpperCase()?1:t.toString().toUpperCase()==e.toString().toUpperCase()?0:-1}functionu(t){for(vare=Ob......
  • 用C#写一个方法对字符串里面的字符次数排序
    namespace_7._17day01{  publicstructMyStruct  {    publicstring_name;    publicint_count;  }  internalclassProgram  {    staticvoidMain(string[]args)    {      stringstr......
  • 易优cms广告管理栏目里面我删除了一个广告。网站没有了,怎么添加
    在广告管理中新增广告新建广告组,上传相应的图片保存,确认提交。根据实际情况,调用广告组或者单独的图片标签 找到相应文档,你的网站文章页广告被删,那就打开templatepcview_article.htm文件,找到第21行左右的下面这句代码,修改新增的图片ID,比如新增的id6......
  • C#面:dot net core管道里面的map拓展有什么作用?
    在.NETCore管道中,Map拓展方法用于将中间件添加到请求处理管道中。它的作用是根据请求的路径或其他条件来选择性地执行中间件。具体来说,Map方法接受一个路径参数和一个委托参数。当请求的路径与指定的路径匹配时,该委托中的中间件将被执行。这使得我们可以根据不同的路径来应用......
  • 易优cms网站notempty功能:判断某个变量是否为空,可以嵌套到任何标签里面使用-Eyoucms
    【基础用法】名称:notempty功能:判断某个变量是否为空,可以嵌套到任何标签里面使用,比如:channel、type等语法:{eyou:notemptyname='$eyou.field.seo_title'/}{$eyou.field.seo_title}{/eyou:notempty}文件:无参数:name=''变量名底层字段:无 【更多示例】-------------------------......
  • 接口文档的书写,git的拉取错误的解决,数据库多表查询的进一步认识(以后开发一定要先仔细
    202407111接口文档的书写:1.1首先写你这个大模块是什么功能。1.2开始根据你的功能写接口文档:2解决git拉取错误的问题:2.1出现这样的问题:(推送出错)2.2原因分析:可能因为重装过系统,或者是安装git的位置发生了变化等情况出现。2.3找到git的安装路径,打开gitbash之后,进......
  • 阿里面试:canal+MQ,会有乱序的问题吗?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......