Pagini recente » Cod sursa (job #256459) | Cod sursa (job #255437) | Cod sursa (job #135378) | Cod sursa (job #252295) | Cod sursa (job #3252020)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Tnode{
int cnt, fii;
Tnode *v[36];
Tnode()
{
cnt = fii = 0;
for(int i = 0; i <= 30; i ++)
v[i] = NULL;
}
};
Tnode *rad = new Tnode;
int op;
string a;
void add(Tnode *nod, string s, int i)
{
if(i == s.size()){
nod -> cnt ++;
return ;
}
int ind = s[i] - 'a';
if(nod -> v[ind] == NULL)
nod -> v[ind] = new Tnode, nod -> fii ++;
add(nod -> v[ind], s, i + 1);
}
int del(Tnode *nod, string s, int i)
{
if(i == s.size())
{
nod -> cnt --;
if(nod -> cnt == 0 && nod -> fii == 0 && nod != rad){
delete nod;
return 1;
}
return 0;
}
int ind = s[i] - 'a';
int ok = del(nod -> v[ind], s, i + 1);
if(ok)
nod -> fii --, nod -> v[ind] = NULL;
if(nod -> cnt == 0 && nod -> fii == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
int apar(Tnode *nod, string s, int i)
{
if(i == s.size())
return nod -> cnt;
int ind = s[i] - 'a';
return apar(nod -> v[ind], s, i + 1);
}
int pref(Tnode *nod, string s, int i)
{
if(i == s.size())
return i;
int ind = s[i] - 'a';
if(nod -> v[ind] == NULL)
return i;
return pref(nod -> v[ind], s, i + 1);
}
int main()
{
while(f >> op >> a)
{
if(op == 0)
add(rad, a, 0);
else if(op == 1)
del(rad, a, 0);
else if(op == 2)
g << apar(rad, a, 0) << '\n';
else
g << pref(rad, a, 0) << '\n';
}
return 0;
}