Pagini recente » Cod sursa (job #236570) | Cod sursa (job #1022766) | Cod sursa (job #1167935) | Cod sursa (job #2890596) | Cod sursa (job #2158532)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
int nr, index, cuv;
char val;
} aux;
vector < nod > EMPTY;
vector < vector< nod > > trie;
int K;
void parcurgere(int i, int j, int n, string s, int op)
{
int sz, nod = 0, nr = 0;
bool ok;
while(j<n)
{
ok = false;
sz = trie[nod].size();
for(i=0; i<sz; ++i) //caut urm litera
{
if(trie[nod][i].val == s[j])
{
if(trie[nod][i].nr > 0)
++nr;
if(op==1)
--trie[nod][i].nr;
if(j==n-1)
{
if(op==2)g<<trie[nod][i].cuv<<'\n';
else if(op==3)g<<nr<<'\n';
else if(op==1)--trie[nod][i].cuv<<'\n';
return;
}
nod = trie[nod][i].index;
++j;
ok = true;
break;
}
}
if(!ok){
if(op==2 && j<n){
g<<"0\n";
return;
}else if(op==3){
g<<nr<<'\n';
return;
}
}
}
}
void adauga(int i, int j, int n, string s)
{
int sz, nod = 0;
while(j<n) //j->string, i->trie
{
bool ok = false;
sz = trie[nod].size();
for(i=0; i<sz; ++i) //caut urm litera
if(trie[nod][i].val == s[j])
{
ok = true;
++trie[nod][i].nr;
if(j==n-1)
++trie[nod][i].cuv;
nod = trie[nod][i].index;
++j;
break;
}
if(!ok) //daca nu am gasit-o o adaug
{
aux.nr = 1;
aux.index = ++K;
aux.val = s[j];
aux.cuv = 0;
if(j==n-1)
aux.cuv = 1;
trie.push_back(EMPTY);
trie[nod].push_back(aux);
nod = aux.index;
++j;
}
}
}
int main()
{
int op, n, i, j;
string s;
trie.push_back(EMPTY);
while(f>>op>>s)
{
n = s.size();
i = j = 0;
if(op==0) adauga(i, j, n, s);
else parcurgere(i, j, n, s, op);
}
/*for(i=0; i<trie.size(); ++i) //afis - verif
{
for(j=0; j<trie[i].size(); ++j)
cout<<"{ "<<trie[i][j].index<<' '<<trie[i][j].val<<' '<<trie[i][j].cuv<<" }"<<' ';
cout<<'\n';
}*/
return 0;
}