Pagini recente » Cod sursa (job #1962508) | Cod sursa (job #919196) | Cod sursa (job #197487) | Cod sursa (job #351014) | Cod sursa (job #1438009)
#include <cstdio>
using namespace std;
#define Nmax 22
FILE *f = fopen ( "trie.in", "r" );
FILE *g = fopen ( "trie.out", "w" );
char S[Nmax];
int maxp;
struct Trie{
int cnt, finish;
Trie *fiu[26];
Trie(){
cnt = finish = 0;
for ( int i = 0; i < 26; ++i )
fiu[i] = NULL;
}
} *T;
void InsertWord ( Trie* Q, int i ){
Q -> cnt++;
if ( !S[i] ){
Q -> finish ++;
return;
}
int CH = S[i] - 'a';
if ( !Q -> fiu[CH] )
Q -> fiu[CH] = new Trie;
InsertWord ( Q -> fiu[CH], i + 1 );
}
void DeleteWord ( Trie* Q, int i ){
Q -> cnt--;
if ( !S[i] ){
Q -> finish--;
return;
}
int CH = S[i] - 'a';
DeleteWord ( Q -> fiu[CH], i + 1 );
}
void CountAparition ( Trie* Q, int i ){
if ( !S[i] ){
fprintf ( g, "%d\n", Q -> finish );
return;
}
int CH = S[i] - 'a';
CountAparition ( Q -> fiu[CH], i + 1 );
}
void LongestPrefix ( Trie* Q, int i ){
if ( !S[i] || Q == NULL ){
fprintf ( g, "%d\n", maxp );
return;
}
if ( Q -> cnt > 1 )
maxp = i + 1;
int CH = S[i] - 'a';
LongestPrefix ( Q -> fiu[CH], i + 1 );
}
int main(){
int type;
T = new Trie;
while ( fscanf ( f, "%d%*c%s", &type, S ) != EOF ){
if ( type == 0 ){
InsertWord ( T, 0 );
continue;
}
if ( type == 1 ){
DeleteWord ( T, 0 );
continue;
}
if ( type == 2 ){
CountAparition ( T, 0 );
continue;
}
if ( type == 3 ){
maxp = 0;
LongestPrefix ( T, 0 );
}
}
return 0;
}