Pagini recente » Cod sursa (job #1981128) | Cod sursa (job #96636) | infoarena - te ajutam sa devii olimpic! | Cod sursa (job #2212707) | Cod sursa (job #1214848)
#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
#include <math.h>
#include <set>
#include <stack>
#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a<b)?b:a)
using namespace std;
//#define TEST
#ifdef TEST
ifstream fin("input.txt");
ofstream fout("output.txt");
#else
ifstream fin("trie.in");
ofstream fout("trie.out");
#endif // TEST
struct trie
{
trie *c[26];
int x,y;
bool b[26];
};
trie root;
string s;
void add(trie &cc, int i)
{
if (i==s.length()) {cc.x++; cc.y++; return;}
cc.y++;
if (cc.b[s[i]-'a']) add(*cc.c[s[i]-'a'],i+1);
else
{
cc.c[s[i]-'a'] = new trie();
cc.b[s[i]-'a'] = true;
add(*cc.c[s[i]-'a'],i+1);
}
}
void del(trie &cc, int i)
{
if (i==s.length()) {cc.x--; cc.y--; return;}
del(*cc.c[s[i]-'a'],i+1);
cc.y--;
if (cc.y && (*cc.c[s[i]-'a']).y==0)
{
cc.b[s[i]-'a']=false;
}
}
int tt(trie cc, int i)
{
if (i==s.length()) {return cc.x;}
if (cc.b[s[i]-'a']) return tt(*cc.c[s[i]-'a'],i+1);
else
{
return 0;
}
}
int pr(trie cc, int i)
{
if (i==s.length()) return s.length();
if (cc.b[s[i]-'a']) return pr(*cc.c[s[i]-'a'],i+1);
else
{
return i;
}
}
int main()
{
root.x=1;
while (!fin.eof())
{
int a;
fin>>a;
fin>>s;
if (fin.eof()) break;
if (a==0)
{
add(root,0);
}
else if (a==1)
{
del(root,0);
}
else if (a==2)
{
fout<<tt(root,0)<<'\n';
}
else
{
fout<<pr(root,0)<<'\n';
}
}
return 0;
}