首页 > 其他分享 >【模板】AC 自动机

【模板】AC 自动机

时间:2024-02-02 21:56:02浏览次数:23  
标签:AC 200005 48 int cc 自动机 模板 string

  • 和“阿狸的打字机”那道题很类似,也是把询问全部放到树上,拓扑排序一遍求解
点击查看代码
#include <bits/stdc++.h>
using namespace std;
string s;
int t[200005][26],tot,fail[200005],ans[200005],cnt[200005],d[200005];
vector<int>g[200005];
queue<int>q;
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 insert(string s,int id)
{
	int cur=0;
	for(int i=0;i<s.size();i++)
	{
		if(t[cur][s[i]-'a']==0)
		{
			tot++;
			t[cur][s[i]-'a']=tot;
		}
		cur=t[cur][s[i]-'a'];
	}
	g[cur].push_back(id);
}
void build()
{
	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++)
	{
		d[fail[i]]++;
	}
}
void calc(string s)
{
	int cur=0;
	for(int i=0;i<s.size();i++)
	{
		cur=t[cur][s[i]-'a'];
		cnt[cur]++;
	}
	for(int i=1;i<=tot;i++)
	{
		if(d[i]==0)
		{
			q.push(i);
		}
	}
	while(!q.empty())
	{
		int n1=q.front();
		q.pop();
		d[fail[n1]]--;
		cnt[fail[n1]]+=cnt[n1];
		for(int i=0;i<g[n1].size();i++)
		{
			ans[g[n1][i]]+=cnt[n1];
		}
		if(d[fail[n1]]==0)
		{
			q.push(fail[n1]);
		}
	}
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string t;
		cin>>t;
		insert(t,i);
	}
	build();
	string s;
	cin>>s;
	calc(s);
	for(int i=1;i<=n;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

标签:AC,200005,48,int,cc,自动机,模板,string
From: https://www.cnblogs.com/watersail/p/18004088

相关文章

  • selenium出现“element not interactable”问题总结
    “elementnotinteractable”问题根因:元素不可交互,可能的原因及解决方法如下所示:1、检查元素的定位(XPATH、CSS_SELECTOR内的内容)是否写正确2、代码中元素进行获取的时候查看是否已经加载出来,等待元素加载可以使用显式等待element= WebDriverWait(browser,20,0.5).until(EC.p......
  • 基础算法(七)高精度除法模板
    模板如下#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>div(vector<int>&A,intB,int&r){vector<int>C;for(inti=0;i<A.size();i++){r=r*10+A[i];......
  • 基础算法(六)高精度乘法模板
    模板如下#include<iostream>#include<vector>usingnamespacestd;vector<int>mul(vector<int>&A,intb){vector<int>C;intk=0;for(inti=0;i<A.size();i++){k+=A[i]*b;C.push_back(k%10);......
  • C++编程练习||Account类:创建一个名为Account的类,银行可以使用它表示客户的银行帐户||I
    1.Account类题目:创建一个名为Account的类,银行可以使用它表示客户的银行帐户。这个类应该包括一个类型为double的数据成员,表示帐户余额。这个类提供一个构造函数,它接受初始余额并用它初始化数据成员。这个构造函数应当确认初始余额的有效性,保证它大于或等于0。否则,余额应设置为0......
  • Oracle之decode函数的使用
    decode是Oracle公司独家提供的功能,它是一个功能很强的函数。它虽然不是SQL的标准,但对于性能非常有用。decode函数的常用场景:1、使用decode判断字符串或数值decode(value,if1,then1,if2,then2,if3,then3,...,else)sql含义为:IF条件=值1THENRETURN(value1)ELSIF......
  • mac 下 Can't attach to the process. Could be caused by an incorrect pid or lack
    问题报错如下ERROR:attach:task_for_pid(4060)failed:'(os/kern)failure'(5)Errorattachingtoprocess:Can'tattachtotheprocess.Couldbecausedbyanincorrectpidorlackofprivileges.sun.jvm.hotspot.debugger.DebuggerException:Can&#......
  • [Flink] Flink源码分析 : BoundedOutOfOrdernessTimestampExtractor
    0序言0.1缘起importorg.apache.flink.api.common.functions.MapFunction;importorg.apache.flink.api.java.tuple.Tuple;importorg.apache.flink.api.java.tuple.Tuple3;importorg.apache.flink.configuration.Configuration;importorg.apache.flink.configuration.......
  • Blazor中使用npm、ts、scss、webpack且自动导入到html
    1、新建一个BlazorApp项目2、新建文件夹WebLib,并在终端中打开执行指令npminit-y在WebLib目录下新建tsconfg.json文件{"compilerOptions":{"noImplicitAny":false,"noEmitOnError":true,"removeComments":false,"sourceMa......
  • vue中的响应式和react中的响应式一样吗?
    Vue.js和React在实现响应式原理上有所不同:Vue.js的响应式机制:依赖收集(DependentDataCollection):Vue使用了基于getter/setter的Object.defineProperty()方法,对数据对象的属性进行拦截。当一个组件渲染时,Vue能够跟踪到模板中哪些数据被访问(getter),并记录下它们之间的......
  • 基础算法(五)高精度减法模板
    模板如下#include<iostream>#include<vector>usingnamespacestd;boolcmp(vector<int>&A,vector<int>&B){if(A.size()!=B.size())returnA.size()>B.size();for(inti=A.size();i>=0;i--){if(A[i]!=B[i])......