Pagini recente » Cod sursa (job #716059) | Cod sursa (job #2319414) | Cod sursa (job #188417) | Cod sursa (job #1617179) | Cod sursa (job #1453525)
#include<fstream>
#include<string.h>
#include<string>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct trie
{
int ishere, endhere;
trie * a[26];
trie ()
{
ishere=endhere=0;
memset(a,0,sizeof(a));
}
};
trie * root = new trie();
int n,typ;
string s;
void insereaza(string s)
{
trie * p = root;
for (int i=0;i<s.size();i++)
{
if (!p->a[s[i]-'a'])
p->a[s[i]-'a'] = new trie();
p=p->a[s[i]-'a']; p->ishere++;
}
p->endhere++;
}
void sterge(string s)
{
trie * p = root;
for (int i=0;i<s.size();i++)
p = p->a[s[i]-'a'], p->ishere--;
p->endhere--;
}
int query(string s)
{
trie * p = root;
for (int i=0;i<s.size();i++)
if (p->a[s[i]-'a']) p=p->a[s[i]-'a'];
else return 0;
return p->endhere;
}
int prefix(string s)
{
trie * p = root;
int rs=0;
for (int i=0;i<s.size();i++)
{
if (!p->a[s[i]-'a']) return rs;
p=p->a[s[i]-'a'];
if (p->ishere) rs=i+1;
}
return rs;
}
int main()
{
while (cin>>typ>>s)
{
if (typ==0) insereaza(s);
if (typ==1) sterge(s);
if (typ==2) cout<<query(s)<<"\n";
if (typ==3) cout<<prefix(s)<<"\n";
}
return 0;
}