Cod sursa(job #108508)

Utilizator GiggityGlen Quagmire Giggity Data 22 noiembrie 2007 20:01:17
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<stdio.h>
#include<string.h>
#include<vector>

using namespace std;

struct node
{
	node *f[3], *next[3];
	vector<node *> R;
	bool end;
};

void add(node **nod, char *s);
void go(node *nod);

char S[10000001];

int N;
node *root, *X;

int main()
{
	char s[32];
	int nr = 0;

	freopen("abc2.in", "r", stdin);
	freopen("abc2.out", "w", stdout);

	fgets(S, 10000001, stdin);
	while(!feof(stdin))
	{
		scanf("%s ", s);
		add(&root, s);
	}
	
	root->R.push_back(root);
	go(root);
	X = root;
	S[strlen(S) - 1] = 0;
	N = strlen(S);
	for(int i = 0; i < N; i++)
	{
		X = X->next[S[i] - 'a'];
		if(X->end)
			nr++;
	}
	printf("%d\n", nr);
	return 0;
}

void add(node **nod, char *s)
{
	if((*nod) == 0)
	{
		*nod = new node;
		(*nod)->f[0] = (*nod)->f[1] = (*nod)->f[2] = 0;
		if(s[0] == 0) (*nod)->end = true;
		else
			(*nod)->end = false, add(&((*nod)->f[s[0] - 'a']), s + 1);
	}
	else
	{
		if(s[0] == 0)(*nod)->end = true;
		else 
			(*nod)->end = false, add(&((*nod)->f[s[0] - 'a']), s + 1);
	}
}

void go(node *nod)
{
	int i, j;
	
	for(j = 0; j < 3; j++)
	{
		nod->next[j] = root;
		if(nod->f[j]) 
		{
			nod->next[j] = nod->f[j];
			continue;
		}

		for(i = nod->R.size() - 1; i >= 0; i--)
		if(nod->R[i]->f[j] != 0)
		{
			nod->next[j] = nod->R[i]->f[j];
			break;
		}
	}
	for(j = 0; j < 3; j++)
		if(nod->f[j])
		{
			nod->f[j]->R.push_back(root);

			for(i = 0; i < nod->R.size(); i++)
				if(nod->R[i]->f[j])
					nod->f[j]->R.push_back(nod->R[i]->f[j]);
		}
	nod->R.clear();
	for(j = 0; j < 3; j++)
		if(nod->f[j])
			go(nod->f[j]);
}