Cod sursa(job #2410498)
Utilizator | Data | 20 aprilie 2019 09:24:04 | |
---|---|---|---|
Problema | Trie | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.04 kb |
#include <fstream>
#include <vector>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TNod{
unsigned int index,nrAparitii,nrCuv;
char val;
TNod(unsigned int index,int nrCuv,int nrAparitii,char val):
index(index),nrCuv(nrCuv),nrAparitii(nrAparitii),val(val)
{
}
};
vector< vector<TNod> > trie;
unsigned int k;
string str;
int op,n,nr,nod,j;
bool ok;
int main()
{
trie.push_back(vector <TNod>());
while(f>>op>>str)
{
n = str.size();
nr = nod = j = 0;
if(op==0)
{
while(j<n)
{
ok = false;
int i;
for(i=0;i<trie[nod].size();++i)
{
if(trie[nod][i].val==str[j])
{
ok = true;
break;
}
}
if(ok)
{
trie[nod][i].nrAparitii++;
if(j==n-1)
trie[nod][i].nrCuv++;
j++;
nod = trie[nod][i].index;
}
else
{
trie.push_back(vector<TNod>());
trie[nod].push_back(TNod(++k,(j==n-1) ? 1 : 0 ,1,str[j]));
nod = k;
++j;
}
}
}
else
{
while(j<n)
{
ok = false;
int i;
for(i=0;i<trie[nod].size();++i)
{
if(trie[nod][i].val==str[j])
{
ok = true;
break;
}
}
if(ok)
{
if(trie[nod][i].nrAparitii>0)
++nr;
if(op==1)
trie[nod][i].nrAparitii--;
if(j==n-1)
{
if(op==1)
{
trie[nod][i].nrCuv--;
}
else if(op==2)
{
g<<trie[nod][i].nrCuv<<'\n';
}
else if(op==3)
{
g<<nr<<'\n';
}
}
nod = trie[nod][i].index;
++j;
}
else
{
if(op==2 && j<n)
{
g<<"0"<<'\n';
}
else if(op==3)
{
g<<nr<<'\n';
}
break;
}
}
}
}
return 0;
}