Cod sursa(job #968149)

Utilizator dropsdrop source drops Data 1 iulie 2013 20:38:50
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("ahocorasick.in");
ofstream gg("ahocorasick.out");

#define max 100001

struct tri{ struct tri* uu[26], *e; vector<int> ll; int r;
	tri(){ memset(uu, 0, sizeof(uu)); e=0; ll.clear(); r=0; } }*t;
int n, aa[102];
vector<tri*> qq;
string ss, pp;

void add(const string& pp, int k){
	int l=pp.length(), c;
	tri* g=t;
	for(int i=0;i<l;i++){
		c=pp[i]-'a'; 
		if(g->uu[c]==0)g->uu[c]=new tri;
		g=g->uu[c];
	}
	g->ll.push_back(k);
}

void bfs(){
	tri *l,*g;
	int p=0;
	t->e=t;
	qq.push_back(t);
	while(p<(int)qq.size()){
		g=qq[p++];
		for(int i=0;i<26;i++)
		if(g->uu[i]!=0){
			for(l=g->e;l!=t && l->uu[i]==0;l=l->e);
			if(l->uu[i]!=0 && l->uu[i] != g->uu[i])l=l->uu[i];
			g->uu[i]->e=l;
			qq.push_back(g->uu[i]);
		}
	}
	t->e=0;
}

void aho(const string &ss){
	int l=ss.length(), c;
	tri *g=t;
	for(int i=0;i<l;i++){
		c=ss[i]-'a';
		while(g!=t && g->uu[c]==0)g=g->e;
		if(g->uu[c]!=0)g=g->uu[c];
		g->r++;
	}
}

void sol(){
	int p=qq.size()-1;
	tri *g;
	while(p>=0){
		g=qq[p--];
		if(g->e!=0) g->e->r += g->r;
		for(int i=0;i<(int)g->ll.size();i++) aa[g->ll[i]]=g->r;
	}
}

int main(){
	t=new tri;
	ff >> ss;
	ff >> n;
	for(int i=1;i<=n;i++){
		ff >> pp;
		add(pp, i);
	}
	bfs();
	aho(ss);
	sol();
	for(int i=1;i<=n;i++) gg << aa[i] << "\n";
}