Pagini recente » Cod sursa (job #23891) | Cod sursa (job #5533) | Cod sursa (job #2384269) | Cod sursa (job #1247337) | Cod sursa (job #1674798)
#include <iostream>
#include <fstream>
#include <map>
#include <cstring>
using namespace std;
struct nod
{
int tr, fin;
map<char, nod*> next;
nod(){
tr = 0;
fin = 0;
}
};
nod * root = new nod();
void add(string s)
{
nod *p = root;
for(int i=0; i<s.size(); i++)
{
if (p->next[s[i]] == 0) p->next[s[i]] = new nod();
p = p->next[s[i]];
++p->tr;
}
++p->fin;
}
void del(string s)
{
nod *p = root;
for(int i=0; i<s.size(); i++)
{
if(p->next[s[i]]->tr == 1)
{
delete(p->next[s[i]]);
p->next[s[i]] = 0;
return;
}
p = p->next[s[i]];
--p->tr;
}
--p->fin;
}
int occ(string s)
{
nod *p = root;
for(int i=0; i<s.size(); i++)
{
if (p->next[s[i]] == 0) return 0;
p = p->next[s[i]];
}
return p->fin;
}
int prefix(string s)
{
nod *p = root;
for(int i=0; i<=s.size(); i++)
{
if (p->next[s[i]] == 0) return i;
p = p->next[s[i]];
}
return s.size();
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
int act;
string s;
while(f >> act >> s)
{
if (act == 0) add(s);
else
if (act == 1) del(s);
else
if (act == 2) g << occ(s) << "\n";
else
if (act == 3) g << prefix(s) << "\n";
}
// cout << root->next['a'];
f.close();
g.close();
return 0;
}