Pagini recente » Cod sursa (job #549656) | Cod sursa (job #2901881) | Cod sursa (job #1799365) | Cod sursa (job #154625) | Cod sursa (job #977551)
Cod sursa(job #977551)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int p, fr; struct trie* f[26];
trie(){ p=fr=0; memset(f,0,sizeof(f));}
}*t;
void Add(const string s)
{
int n = s.length(), c;
trie* x = t;
for(int i=0; i<n; i++)
{
c = s[i] - 'a';
if(!x->f[c]) x->f[c] = new trie();
x = x->f[c];
x->p++;
}
x->fr++;
}
void Erase(const string s)
{
int n = s.length(), c;
trie* x = t;
for(int i=0; i<n; i++)
{
c = s[i] - 'a';
x = x->f[c];
x->p--;
}
x->fr--;
}
int Frequ(const string s)
{
int n = s.length(), c;
trie* x = t;
for(int i=0; i<n; i++)
{
c = s[i] - 'a';
if(!x->f[c]) return 0;
x = x -> f[c];
}
return x->fr;
}
int Pref(const string s)
{
int n = s.length(), c;
trie* x = t;
for(int i=0; i<n; i++)
{
c = s[i] - 'a';
if(!x->f[c] || !x->f[c]->p) return i;
x = x->f[c];
}
return n;
}
int main()
{
int tip; string s;
t = new trie();
while(fin>>tip>>s)
{
if(!tip) Add(s); else
if(tip == 1) Erase(s); else
if(tip == 2) fout<<Frequ(s)<<'\n'; else
fout<<Pref(s)<<'\n';
}
return 0;
}