Pagini recente » Cod sursa (job #1132459) | Cod sursa (job #793182) | Cod sursa (job #443202) | Cod sursa (job #255504) | Cod sursa (job #1410042)
#include <fstream>
#include <cstring>
using namespace std;
#define sigma 26
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int ap,nrfii;
trie* T[sigma];
trie()
{
nrfii = 0;
ap = 0;
for(int i=0;i<sigma;++i) T[i] = NULL;
}
} *root = new trie;
void add(char sir[])
{
trie* crt = root;
int poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
poz = sir[i]-'a';
crt->nrfii++;
if(crt->T[poz] == NULL) crt->T[poz] = new trie;
crt = crt->T[poz];
}
crt->ap++;
crt->nrfii++;
}
void del(char sir[])
{
trie* crt = root;
int poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
poz = sir[i]-'a';
if(crt->nrfii > 0) crt->nrfii--;
crt = crt->T[poz];
}
crt->ap--;
if(crt->nrfii > 0) crt->nrfii--;
}
int frecv(char sir[])
{
trie* crt = root;
int poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
poz = sir[i]-'a';
if(crt->T[poz] && crt->nrfii) crt = crt->T[poz];
else return 0;
}
return crt->ap;
}
int pref(char sir[])
{
trie* crt = root;
int poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
poz = sir[i]-'a';
if(crt->T[poz] && crt->nrfii) crt = crt->T[poz];
else return i;
}
return n;
}
int main()
{
int op;
char sir[26];
while(f>>op>>sir)
{
if(op == 0) add(sir);
if(op == 1) del(sir);
if(op == 2) g<<frecv(sir)<<"\n";
if(op == 3) g<<pref(sir)<<"\n";
}
f.close();
g.close();
return 0;
}