Cod sursa(job #100119)

Utilizator webspiderDumitru Bogdan webspider Data 11 noiembrie 2007 21:42:23
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 2.08 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

const int maxL = 21;
const int maxS = 2000001;
const int maxT = 10000002;

vector<int> stariLvl[ maxL ];

int stareCur;
int prevCur;
int nrStari;
int nPoz;
int m;
char text[ maxT ];
char auxc[ maxL ];

int trie[ maxS ][ 3 ];
int stare[ maxS ][ 3 ];
int level[ maxS ];
int prev[ maxS ];
int prevM[ maxS ];

bool pf[ maxS ];

int ret( char lt ) {
	if ( lt == 'a' ) return 0;
	if ( lt == 'b' ) return 1;
	if ( lt == 'c' ) return 2;
}

void make_trie( char cuv[ maxL ] ) {
	int n = strlen( cuv );
	int i,j;
	int temp = 0;
	int lc=0, lm=0;
	stareCur = 0;
	for ( i = 0; i < n; i++ ) {
		if ( trie[ stareCur ][ ret( cuv[i] ) ] <= stareCur ) {
			nrStari++;
			trie[ stareCur ][ ret( cuv[i] ) ] = nrStari;
			prev[ nrStari ] = stareCur;
			prevM[ nrStari ] = ret( cuv[i] );
			level[ nrStari ] = level[ stareCur] + 1;
			stariLvl[ level[ nrStari ] ].push_back( nrStari );
			stareCur = nrStari;
		}
		else stareCur = trie[ stareCur ][ ret(cuv[i]) ];
	}
	pf[ stareCur ] = 1;
}

int main() 
{
	int i,j,l;

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

	scanf("%s\n", text);
	while ( !feof( stdin ) ) {
		scanf("%s\n", auxc );
		m = strlen( auxc );
		make_trie( auxc );
	}
	for ( i = 1; i <= m; i++ ) {
		for ( j = 0; j < stariLvl[ i ].size(); j++ ) {
			stareCur = stariLvl[ i ][ j ];
			prevCur = stare[ prev[ stareCur ] ][ prevM[ stareCur ] ];
			for ( l = 0; l < 3; l++ )
				stare[ stareCur ][ l ] = stare[ prevCur ][ l ];
			if ( level[ prev[ stareCur ] ] == level[ prevCur ] ) {
				for ( l = 0; l < 3; l++ ) 
					if ( trie[ prevCur ][ l ] ) 
						stare[ stareCur ][ l ] = trie[ prevCur ][ l ];
			}
			stare[ prev[ stareCur ] ][ prevM[ stareCur ] ] = stareCur;
		}	
	}	
	/* Debug
	for ( i = 0; i <= nrStari; i++ )
		printf("%d %d %d %d\n", stare[ i ][0], stare[ i ][1], stare[ i ][2], pf[ i ] );
	*/
	stareCur = 0;
	m = strlen( text );
	for ( i = 0; i < m; i++ ) {
		stareCur = stare[ stareCur ][ ret( text[i] ) ];
		if ( pf[ stareCur ] ) 
			nPoz++;
	}
	printf("%d\n", nPoz );

	fclose(stdin);
	fclose(stdout);

	return 0;
}