Pagini recente » Cod sursa (job #2516878) | Cod sursa (job #1988483) | Cod sursa (job #327587) | Cod sursa (job #3278012) | Cod sursa (job #1386195)
#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';
if(crt->T[poz] == NULL)
{
crt->T[poz] = new trie;
crt->nrfii++;
}
crt = crt->T[poz];
}
crt->ap++;
}
void del(char sir[])
{
trie* crt = root;
int poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
poz = sir[i]-'a';
crt->nrfii--;
crt = crt->T[poz];
}
crt->ap--;
}
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 = crt->T[poz];
}
return crt->ap;
}
int pref(char sir[])
{
//g<<sir<<"\n";
trie* crt = root;
int ans=0, poz, n = strlen(sir);
for(int i=0;i<n;++i)
{
//g<<sir[i]<<" -> "<<crt->nrfii<<"\n";
poz = sir[i]-'a';
if(crt->nrfii || crt->ap) ans = i;
if(crt->T[poz]) crt = crt->T[poz];
else break;
}
return ans;
}
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;
}