Pagini recente » Cod sursa (job #2714365) | Cod sursa (job #374501) | Cod sursa (job #1496533) | Cod sursa (job #1438435) | Cod sursa (job #1653710)
#include <fstream>
#include <string>
using namespace std;
struct tr{
int trm, ct;
tr* nxt[26];
tr(){
trm = 0;
ct = 0;
}
};
string s;
ifstream f("trie.in");
ofstream cout("trie.out");
void ins(tr* n, int p)
{
if(p == s.size()-1){
++n->trm;
return;
}
++n->ct;
int nt = s[p+1]-'a';
if(n->nxt[nt] == NULL)
n->nxt[nt] = new tr();
ins(n->nxt[nt], p+1);
}
void rm(tr* n, int p)
{
if(p == s.size()-1){
--n->trm;
return;
}
--n->ct;
int nt = s[p+1]-'a';
if(n->nxt[nt] == NULL)
return;
rm(n->nxt[nt], p+1);
}
void find(tr* n, int p)
{
if(p == s.size()-1){
cout << n->trm << '\n';
return;
}
else{
int nt = s[p+1]-'a';
if(n->nxt[nt] == NULL)
n->nxt[nt] = new tr();
find(n->nxt[nt], p+1);
}
}
void mpr(tr* n, int p)
{
if(!n->ct && !n->trm){
cout << p << '\n';
return;
}
if(p == s.size()-1){
cout << p+1 << '\n';
return;
}
else{
int nt = s[p+1]-'a';
if(n->nxt[nt] == NULL){
cout << p+1 << '\n';
return;
}
mpr(n->nxt[nt], p+1);
}
}
int main()
{
int t;
tr* r;
r = new tr();
f >> t;
while(!f.eof())
{
f >> s;
switch(t)
{
case 0: {
int st = s[0]-'a';
if(r->nxt[st] == NULL)
r->nxt[st] = new tr();
ins(r->nxt[st], 0);
break;
}
case 1: {
int st = s[0]-'a';
rm(r->nxt[st], 0);
break;
}
case 2: {
int st = s[0]-'a';
if(r->nxt[st] == NULL)
cout << "0\n";
else
find(r->nxt[st], 0);
break;
}
case 3: {
int st = s[0]-'a';
if(r->nxt[st] == NULL)
cout << "0\n";
else
mpr(r->nxt[st], 0);
break;
}
}
f >> t;
}
return 0;
}