Pagini recente » Cod sursa (job #2568804) | Cod sursa (job #1232124) | Cod sursa (job #2291890) | Cod sursa (job #2616982) | Cod sursa (job #3040050)
#include <fstream>
#include <string>
using namespace std;
int k;
string s;
struct trie{
struct trie* child[26];
int fr,fin;
bool vf;
};
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->fr++;
q=q->child[j];
}
q->fin++;
q->fr++;
}
trie* tdelete(trie* q, string s, int poz)
{
if(!q)
return q;
if(poz==s.length())
{
q->fr--;
q->fin--;
if(q->fr==0 && !q->vf)
{
delete q;
q=NULL;
}
return q;
}
int j=s[poz]-'a';
q->child[j]=tdelete(q->child[j],s,poz+1);
q->fr--;
if(q->fr==0 && !q->vf)
{
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->fin;
}
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();
p->vf = true;
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;
}