Pagini recente » Cod sursa (job #1156006) | Cod sursa (job #549152) | Cod sursa (job #2294097) | Cod sursa (job #2294094) | Cod sursa (job #1807154)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int k=0;
struct trie{
int nrFii;
int _final;
trie *V[26];
trie(){
nrFii = 0;
_final = 0;
memset(V, 0, sizeof(V));
}
};
trie *T = new trie;
void _add(trie *T, char A[]){
int N=strlen(A);
for(int i=0; i<N; ++i){
if(T->V[A[i]-'a'] == NULL){
T->V[A[i]-'a'] = new trie;
T->nrFii += 1;
}
T = T->V[A[i]-'a'];
}
T->_final += 1;
}
int _find(trie *T, char A[]){
int N=strlen(A);
for(int i=0; i<N; ++i){
if(T->V[A[i]-'a'] == NULL)
return 0;
else T=T->V[A[i]-'a'];
}
return T->_final;
}
int _delete(trie *T, char A[])
{
if(A[0] == 0){
if(T->_final > 1 || T->nrFii) {
T->_final--;
return 0;
}
else{
delete T;
return 1;
}
}
else{
int X = _delete(T->V[A[0] - 'a'], A+1);
if(X == 0){
return 0;
}
else{
T->V[A[0] - 'a'] = NULL;
T->nrFii--;
if(T->nrFii == 0 && T->_final == 0) {
delete T;
return 1;
}
else{
return 0;
}
}
}
}
int _prefixComun(trie *T, char A[], int i=0)
{
int N=strlen(A);
for(; i<N; ++i)
{
if(T->V[A[i]-'a'] == NULL)
return i;
else{
T = T->V[A[i]-'a'];
}
}
return i;
}
int main(){
int test;
char A[51];
while(fin>>test>>A){
switch(test){
case 0: _add(T, A);break;
case 1: _delete(T, A);break;
case 2: fout<<_find(T, A)<<'\n';break;
case 3: fout<<_prefixComun(T, A)<<'\n';break;
}
}
return 0;
}