Pagini recente » Cod sursa (job #2267866) | Cod sursa (job #2200836) | Cod sursa (job #2549814) | Cod sursa (job #1100427) | Cod sursa (job #2426265)
#include <bits/stdc++.h>
using namespace std;
#define ALPHABET_SIZE 26
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
struct nod* v[ALPHABET_SIZE];
unsigned int ap=0;
bool fr;
nod()
{
fr = false;
for (unsigned int i = 0; i < ALPHABET_SIZE; i++)
v[i] = NULL;
}
bool empty()
{
for (unsigned int i = 0; i < ALPHABET_SIZE; i++)
if (v[i])
return false;
return true;
}
void insert(string key)
{
nod* pCrawl = this;
for (unsigned int i = 0; i < key.length(); i++)
{
unsigned int index = key[i] - 'a';
if (!pCrawl->v[index])
pCrawl->v[index] = new nod();
pCrawl = pCrawl->v[index];
}
pCrawl->fr = true;
pCrawl->ap++;
}
unsigned int search(string key)
{
nod* pCrawl = this;
for (unsigned int i = 0; i < key.length(); i++)
{
unsigned int index = key[i] - 'a';
if (!pCrawl->v[index])
return false;
pCrawl = pCrawl->v[index];
}
return int(pCrawl != NULL && pCrawl->fr)*pCrawl->ap;
}
nod* remove(nod* r, string s, unsigned int depth = 0)
{
if (!r)
return NULL;
if (depth == s.size())
{
if(r->ap>1)
{
r->ap--;
return r;
}
if (r->fr)
r->fr = false;
if (r->empty())
{
delete (r);
r = NULL;
}
return r;
}
unsigned int index = s[depth] - 'a';
r->v[index] = remove(r->v[index], s, depth + 1);
if (r->empty() && r->fr == false)
{
delete (r);
r = NULL;
}
return r;
}
nod* remove(string s)
{
return remove(this, s);
}
};
nod* r = new nod();
int main()
{
int x;
string s;
while(f>>x>>s)
switch(x)
{
case 0:r->insert(s);break;
case 1:r->remove(s);break;
case 2:g<<r->search(s)<<'\n';break;
case 3:
{
nod* p=r;
int i=0;
while(p->v[s[i]-'a'])
{
p=p->v[s[i]-'a'];
i++;
}
g<<i<<'\n';
}break;
}
f.close();
g.close();
return 0;
}