Pagini recente » Cod sursa (job #1587573) | Cod sursa (job #91815) | Cod sursa (job #2719064) | Cod sursa (job #2124207) | Cod sursa (job #424580)
Cod sursa(job #424580)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int nr, pref;
Trie *fii[30], *tata;
Trie()
{
nr = pref = 0;
}
};
Trie t, *it, *it2, *to_delete[1000];
int n, op, val, i, l, len;
char s[22],*p;
int main()
{
//t = new Trie();
while(in>>op>>s)
{
p = s;
it = &t;
l = 0;len=0;
while(p[0] != '\0')
{
if(it->fii[p[0] - 'a'] == NULL && op == 3)
break;
if(it->fii[p[0] - 'a'] == NULL)
it->fii[p[0] - 'a'] = new Trie(), it->fii[p[0] - 'a']->tata = it,
it = it->fii[p[0] - 'a'];
else
it = it->fii[p[0] - 'a'];
if(op == 0)
++ it->pref;
else if(op == 1 && it->pref > 0)
-- it->pref;
else if(op == 3 && it->pref > 0)
l = p-s+1;
p++;
}
if(op == 0)
it->nr ++;
else if(op == 1 && it->nr > 0)
{
it->nr --;
l = strlen(s)-1;
while(it->pref == 0 && it != &t)
{
it2 = it->tata;
it2->fii[s[l--] - 'a'] = NULL;
/*for(i=0; i<30; i++)
if(it2->fii[i] == it)
{it2->fii[i] = NULL; break;}*/
delete it;
it = it2;
}
}
else if(op == 2)
out<<it->nr<<'\n';
else if(op == 3)
out<<l<<'\n';
}
return 0;
}