Pagini recente » Cod sursa (job #130477) | Cod sursa (job #1327967) | Cod sursa (job #2953641) | Cod sursa (job #756773) | Cod sursa (job #1958299)
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{int aparitii, prefix;
nod *nxt[26];
nod() //functie cu numele variabilei, pentru a verifica daca nodul a mai fost parcurs; se numeste constructor
{
prefix=0;
aparitii=0;
for(int i=0; i<26; i++) nxt[i]=NULL;
}
}*rad;;
char cuv[30];
nod *insert(nod *act, char v[])
{
if(act==NULL)
{
act=new nod;
}
act->prefix++; //sau (*act).prefix++;
if (v[0]==0) //verificare daca s-a terminat cuvantul
{
act->aparitii++;
return act;
}
act->nxt[v[0]-'a']=insert(act->nxt[v[0]-'a'], v+1); //v[0] e in [96, 96+26); dar v[0]-'a' e in [0, 26)
return act;
}
nod *erase(nod *act, char v[])
{
act->prefix--; //se scade o aparitie
if (v[0]==0) //verificare daca s-a terminat cuvantul
{
act->aparitii--;
if(act->prefix==0 && act->aparitii==0 ) //act->prefix==0 e suficient pentru a verifica daca mai are o valoare nenula in nod
{
delete act;
act==NULL;
}
return act;
}
if(act->prefix==0)
{
delete act;
act=NULL;
}
act->nxt[v[0]-'a']=erase(act->nxt[v[0]-'a'], v+1);
}
int search(nod *act, char v[])
{
if(act==NULL) return 0;
if(v[0]==0) return act->aparitii;
else return search(act->nxt[v[0]-'a'], v+1);
}
int len_prefix(nod *act, char v[])
{
if(act==NULL) return -1;
if(v[0]==0) return 0;
int val=len_prefix(act->nxt[v[0]-'a'], v+1);
return 1+val;
}
int main()
{
int t;
while(f>>t)
{
f>>cuv;
f.get();
if(t==0) rad=insert(rad, cuv);
if(t==1) rad=erase(rad, cuv);
if(t==2) g<<search(rad, cuv)<<"\n";
if(t==3) g<<len_prefix(rad, cuv)<<"\n";
}
return 0;
}