Pagini recente » Cod sursa (job #1981745) | Cod sursa (job #2298249) | Cod sursa (job #127782) | Cod sursa (job #1245863) | Cod sursa (job #1653985)
#include <fstream>
#include <cstring>
#include <stdlib.h>
using namespace std;
struct tr{
int trm, ct;
tr* nxt[26];
tr(){
trm = 0;
ct = 0;
memset(nxt, 0, sizeof(nxt));
}
};
string s;
tr* r = new tr();
ifstream f("trie.in");
ofstream cout("trie.out");
void ins(tr* n, unsigned int p)
{
if(p == s.size())
{
++n->trm;
return;
}
++n->ct;
int d = s[p]-'a';
if(n->nxt[d] == NULL)
n->nxt[d] = new tr;
ins(n->nxt[d], p+1);
}
int rm(tr* n, unsigned int p)
{
int d = s[p]-'a';
if(p == s.size())
--n->trm;
else if(rm(n->nxt[d], p+1))
{
--n->ct;
n->nxt[d] = NULL;
}
if(!n->ct && !n->trm && n != r)
{
free(n);
return 1;
}
return 0;
}
void nr(tr* n, unsigned int p)
{
if(p == s.size())
{
cout << n->trm << '\n';
return;
}
int d = s[p]-'a';
if(n->nxt[d] == NULL)
{
cout << 0 << '\n';
return;
}
nr(n->nxt[d], p+1);
}
void lgst_pr(tr* n, unsigned int p)
{
int d = s[p]-'a';
if(!&n->nxt[d] || n->nxt[d] == NULL || p == s.size())
{
cout << p << '\n';
return;
}
lgst_pr(n->nxt[d], p+1);
}
int main()
{
int t;
f >> t;
while(!f.eof())
{
f >> s;
switch(t)
{
case 0: {ins(r, 0); break;}
case 1: {rm(r, 0); break;}
case 2: {nr(r, 0); break;}
case 3: {lgst_pr(r, 0); break;}
}
f >> t;
}
return 0;
}