Cod sursa(job #2404663)
Utilizator | Data | 13 aprilie 2019 11:20:55 | |
---|---|---|---|
Problema | Trie | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.7 kb |
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Tnod
{
char chr;
int nrap,nrcuv,urm;
};
vector <vector <Tnod> > t;
char str[10001];
int op,i,j,n,ok,nod,nr,sz,k;
int main()
{
t.push_back(vector <Tnod>());
while(f>>op>>str)
{
n = strlen(str);
nr = nod = j = 0;
switch (op)
{
case 0:
while(j<n)
{
ok=false;
sz=t[nod].size();
for(i=0; i<sz;i++)
{
if(t[nod][i].chr==str[j])
{
ok=true;
break;
}
}
if(ok)
{
++t[nod][i].nrap;
if(j==n-1)++t[nod][i].nrcuv;
j++;
nod=t[nod][i].urm;
}
else
{
t.push_back(vector<Tnod>());
Tnod aux;
aux.chr=str[j];
aux.nrap=1;
if(j==n-1)aux.nrcuv=1;
else aux.nrcuv=0;
aux.urm = ++k;
t[nod].push_back(aux);
nod = k;
j++;
}
}
break;
case 1:
case 2:
case 3:
while(j < n){
ok = false;
sz = t[nod].size();
for(i=0; i<sz; ++i)
if(t[nod][i].chr == str[j])
{ok = true; break;}
if(ok){
if(t[nod][i].nrap > 0)
++nr;
if(op == 1) //stergere
--t[nod][i].nrap;
if(j == n-1){
if(op == 2) //afis nr cuvinte
g << t[nod][i].nrcuv << '\n';
else if(op==3) //afis lungime max comuna
g << nr << '\n';
else if(op==1) //sterge si aparitia cuvantului
--t[nod][i].nrcuv;
}
nod = t[nod][i].urm;
++j;
}
else {
if(op == 2 && j < n)
g << "0\n";
else if(op == 3)
g << nr << '\n';
break; //exit the while loop
}
}
break;
}
}
return 0;
}