Cod sursa(job #723974)

Utilizator ms-ninjacristescu liviu ms-ninja Data 26 martie 2012 09:05:55
Problema Aho-Corasick Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
#define dim 1000005
#define maxn 10005
int n,nr, pi[maxn],lung,sol;
char v[dim], b[maxn];
void read()
{
	char c;
	while((c=fin.get()) && (c!='\n'))
		v[++nr]=c;
	v[0]=' ';
	fin>>n;
	c=fin.get();
}

void make_prefix()
{
	int i, q=0;
	for(i=2;i<=lung;++i)
	{
		while(q!=0 && b[q+1]!=b[i])
			q=pi[q];
		if(b[q+1]==b[i])
			++q;
		pi[i]=q;
	}
}

void init()
{
	char c;
	lung=sol=0;
	while((c=fin.get()) && (c!='\n') && (c!=EOF))
		b[++lung]=c;
	b[0]=' ';
}

void solve()
{
	for(int i=1;i<=n;++i)
	{
		init();
		make_prefix();
		int q=0;
		for(int j=1;j<=nr;++j)
		{
			while(q!=0 && b[q+1]!=v[j])
				q=pi[q];
			if(b[q+1]==v[j])
				++q;
			if(q==lung)
			{
				++sol;
				q=pi[lung];
			}
		}
		memset(pi,0,lung+1);
		
		fout<<sol<<'\n';
	}
}

int main()
{
	read();
	solve();
	
	return 0;
}