Cod sursa(job #98800)

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

#define LMAX 1000010

int N;

char s[LMAX];

int trie[3][LMAX];
int tata[LMAX];
unsigned char tatam[LMAX];
int niv[LMAX];

int term[LMAX];

vector <pair <int, int> > vec;

int aut[3][LMAX];

char ss[10000010];

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;
					
					tata[ns] = cur;
					tatam[ns] = s[j] - 'a';
					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] = i;

			i++;
		}

		sort(vec.begin(), vec.end());

		vector <pair <int, int> > :: iterator it;

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

		for (it = vec.begin(); it != vec.end(); ++it) {
			cur = (*it).second;

			ant = aut[tatam[cur]][tata[cur]];

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

			//memcpy(aut[cur], aut[ant], sizeof(aut[cur]));

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

			if (niv[ant] == niv[tata[cur]])
			{
//				printf("da\n");
				for (i = 'a'; i <= 'c'; ++i) 
					if (trie[i - 'a'][ant]) aut[i - 'a'][cur] = trie[i - 'a'][ant];
			}
			aut[tatam[cur]][tata[cur]] = 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;
}