Pagini recente » Cod sursa (job #794739) | Cod sursa (job #1820039) | Cod sursa (job #2835310) | Cod sursa (job #569708) | Cod sursa (job #2307393)
#include <iostream>
#include <fstream>
using namespace std;
struct nod{
nod *fiu[('z'-'a'+1)];
int val;
int nrt;
};
nod *creeaza_nod(){
nod *na = new nod;
na -> val = 0;
na -> nrt = 0;
for( int i = 'a'; i <= 'z'; i++ )
na -> fiu[ i - 'a' ] = 0;
return na;
}
int o;
nod *n0 = creeaza_nod();
string s;
void adauga( string cv ){
int i;
nod *nda;
for( i = 0, nda = n0; i < (int)cv.size(); i++ ){
nda -> nrt++;
if( nda -> fiu[ cv[i] - 'a' ] == 0 )
nda -> fiu[ cv[i] - 'a' ] = creeaza_nod();
nda = nda -> fiu[ cv[i] - 'a' ];
}
nda -> nrt++;
nda -> val++;
}
void sterge( string cv ){
int i;
nod *nda;
for( i = 0, nda = n0; i < (int)cv.size(); i++ ){
nda -> nrt--;
nda = nda -> fiu[ cv[i] - 'a' ];
}
nda -> nrt--;
nda -> val--;
}
int nraparitii(string cv){
int i;
nod *nda;
for( i = 0, nda = n0; i < (int)cv.size(); i++ )
nda = nda -> fiu[ cv[i] - 'a' ];
return nda -> val;
}
int sufxmaxcom(string cv){
int i, ansa = 0;
nod *nda;
for( i = 0, nda = n0; i < (int)cv.size(); i++ ){
if( nda -> fiu[ cv[i] - 'a' ] == 0 )
break;
nda = nda -> fiu[ cv[i] - 'a' ];
if( nda -> nrt != 0 )
ansa = i + 1;
}
return ansa;
}
int main()
{
ifstream f ( "trie.in" );
ofstream g ( "trie.out" );
while( f >> o ){
f >> s;
if( o == 0 ) adauga( s );
if( o == 1 ) sterge( s );
if( o == 2 ) g << nraparitii( s ) << '\n';
if( o == 3 ) g << sufxmaxcom( s ) << '\n';
}
f.close ();
g.close ();
return 0;
}