Pagini recente » Cod sursa (job #2712615) | Cod sursa (job #937581) | ionut | Cod sursa (job #2836857) | Cod sursa (job #100125)
Cod sursa(job #100125)
#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] ) ] ) {
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;
}