Cod sursa(job #3256752)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 16 noiembrie 2024 08:14:17
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
int go(int,int);
int suflink(int);
string v;
int sol[105];
int n;
int where[105];
struct node
{
	int lit;
	int par;
	int go[26];
	int suflink;
	int dp;
	int niv;
};
node emp;
vector<node> t;
int newnode()
{
	int x=t.size();
	t.push_back(emp);
	return x;
}
void add(string s,int ind)
{
	int me=0;
	for(char c:s)
	{
		int lit=c-'a';
		if(t[me].go[lit]==-1)
		{
			int x=newnode();
			t[me].go[lit]=x;
			t[x].par=me;
			t[x].lit=lit;
			t[x].niv=t[me].niv+1;
		}
		me=t[me].go[lit];
	}
	where[ind]=me;
}
bool comp(int a,int b)
{
	return t[a].niv>t[b].niv;
}
int go(int me,int lit)
{
	if(t[me].go[lit]!=-1)
		return t[me].go[lit];
	if(me==0)
		return 0;
	t[me].go[lit]=go(suflink(me),lit);
	return t[me].go[lit];	
}
int suflink(int me)
{
	if(t[me].suflink!=-1)
		return t[me].suflink;
	if(me==0||t[me].par==0)
		return 0;
	t[me].suflink=go(suflink(t[me].par),t[me].lit);
	return t[me].suflink;
}
int main()
{
	ios_base::sync_with_stdio(false);
	fin.tie(0);
	emp.lit=-1;
	emp.par=-1;
	emp.suflink=-1;
	for(int i=0;i<26;i++)
		emp.go[i]=-1;
	emp.dp=0;
	emp.niv=0;
	t.push_back(emp);
	fin>>v;
	fin>>n;
	for(int i=1;i<=n;i++)
	{
		string s;
		fin>>s;
		add(s,i);
	}
	int me=0;
	for(char c:v)
	{
		int lit=c-'a';
		me=go(me,lit);
		t[me].dp++;
	}
	vector<int> ord;
	for(int i=0;i<t.size();i++)
		ord.push_back(i);
	sort(ord.begin(),ord.end(),comp);
	for(int me:ord)
		if(me!=0)
			t[suflink(me)].dp+=t[me].dp;
	for(int i=1;i<=n;i++)
		fout<<t[where[i]].dp<<'\n';
	return 0;
}