Pagini recente » Cod sursa (job #322653) | Cod sursa (job #2709270) | Cod sursa (job #2341164) | Cod sursa (job #3240396) | Cod sursa (job #3032188)
#include <fstream>
#include <string>
using namespace std;
int k;
string s;
struct trie{
struct trie* child[26];
int fr;
};
ifstream f ("trie.in");
ofstream g ("trie.out");
void tinsert(trie* p,string s)
{
trie *q=p;
int n=s.length();
for(int i=0;i<n;i++)
{
int j=s[i]-'a';
if(!q->child[j])
{
trie *o=new trie();
q->child[j]=o;
}
q=q->child[j];
}
q->fr++;
}
bool isEmpty(trie* q)
{
for(int i=0;i<=25;i++)
if(q->child[i])
return false;
return true;
}
trie* tdelete(trie* q, string s, int poz)
{
if(!q)
return NULL;
if(poz==s.length())
{
q->fr--;
if(q->fr==0 && isEmpty(q))
{
delete q;
q=NULL;
}
return q;
}
int j=s[poz]-'a';
q->child[j]=tdelete(q->child[j],s,poz+1);
if(isEmpty(q))
{
delete q;
q=NULL;
}
return q;
}
int tfind(trie* p, string s)
{
trie *q=p;
int n=s.length();
for(int i=0;i<n;i++)
{
int j=s[i]-'a';
if(!q->child[j])
return 0;
q=q->child[j];
}
return q->fr;
}
int tpre(trie* p, string s)
{
trie *q=p;
int n=s.length();
for(int i=0;i<n;i++)
{
int j=s[i]-'a';
if(!q->child[j])
return i;
q=q->child[j];
}
return n;
}
int main()
{
trie* p = new trie();
while(f>>k>>s)
{
if(k==0)
tinsert(p,s);
else if(k==1)
p=tdelete(p,s,0);
else if(k==2)
g<<tfind(p,s)<<'\n';
else
g<<tpre(p,s)<<'\n';
}
f.close();
g.close();
return 0;
}