Cod sursa(job #98814)

Utilizator gcosminGheorghe Cosmin gcosmin Data 10 noiembrie 2007 17:18:53
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.63 kb
#include <stdio.h>
#include <bitset>
#include <vector>
#include <algorithm>
using namespace std;

#define LMAX 1000010

int N;

char s[LMAX];

int trie[3][LMAX];
int niv[LMAX];

bitset <LMAX> term;

int aut[3][LMAX];

char ss[10000010];

int coada[LMAX];

int main()
{
	int i, j, cur, ant;
	
	freopen("abc2.in", "r", stdin);
	freopen("abc2.out", "w", stdout);

	fgets(ss, 10000010, stdin);

		// ----------- automat ------------- //

		int ns = 1;
		niv[1] = 0;
		
		i = 1;
		while (fgets(s, LMAX, stdin)) {
			cur = 1;

			for (j = 0; 'a' <= s[j] && s[j] <= 'c'; j++)
				if (!trie[s[j] - 'a'][cur]) {
					ns++;
					trie[s[j] - 'a'][cur] = ns;
					
					niv[ns] = niv[cur] + 1;
//					vec.push_back(make_pair(niv[ns], ns));
							
					cur = ns;									
				} else { 
					cur = trie[s[j] - 'a'][cur];
				}

//			printf("%d\n", ns);
			
			term[cur] = 1;

			i++;
		}

		for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][1] = 1;

		int p, q;

		coada[0] = 1;
		p = q = 0;
		int x;

		while (p <= q) {
			x = coada[p];
			p++;

			for (j = 'a'; j <= 'c'; j++) {
				if (!trie[j - 'a'][x]) continue;

				cur = trie[j - 'a'][x];

				coada[++q] = cur;

				ant = aut[j - 'a'][x];

				if (term[ant] == 1) term[cur] = 1;

				for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][cur] = aut[i - 'a'][ant];

				if (niv[ant] == niv[x])
					for (i = 'a'; i <= 'c'; ++i) 
						if (trie[i - 'a'][ant]) aut[i - 'a'][cur] = trie[i - 'a'][ant];

				aut[j - 'a'][x] = cur;
			}
		}

		cur = 1;

		int rez = 0;

		for (i = 0; 'a' <= ss[i] && ss[i] <= 'c'; i++) {
			cur = aut[ss[i] - 'a'][cur];

			rez += term[cur] > 0;
		}

		printf("%d\n", rez);

fclose(stdin);
fclose(stdout);
return 0;
}