Pagini recente » Cod sursa (job #2586072) | Cod sursa (job #42319) | Cod sursa (job #960206) | Cod sursa (job #2145630) | Cod sursa (job #1045306)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int len, t;
char s[1000];
struct trie
{
char val=666;
int freq=0;
vector<trie*> v;
};
trie *head = new trie;
vector<trie*>::iterator it;
void update_trie()
{
trie *p=head;
for(int i=2; i<len; ++i)
{
int tst=0;
if(!p->v.size())
{
//cout<<"!size "<<s[i]<<'\n';
trie *add = new trie;
add->val=s[i];
p->v.push_back(add);
p=add;
if(i==len-1)(p)->freq++;
continue;
}
else for(it=(p->v.begin()); it!=(p->v.end()); ++it)
if(p->v.size()&&(*it)->val==s[i])
{
if(i==len-1)(*it)->freq++;
//cout<<"found "<<s[i]<<' '<<(*it)->freq<<'\n';
p=*it;
tst=1;
break;
}
if(!tst)
{
//cout<<"!found "<<s[i]<<'\n';
trie *add = new trie;
add->val=s[i];
p->v.push_back(add);
p=add;
if(i==len-1)p->freq++;
}
}
}
void del_word()
{
trie *p=head;
trie *del=head;
for(int i=2; i<len; ++i)
for(it=(p->v.begin()); it!=(p->v.end()); ++it)
{
if((*it)->val==s[i])
{
if(p->v.size()>1) del=*it;
p=*it;
break;
}
}
if(p->freq>1) p->freq--;
else
{
while(del->v.size())
{
p=del;
del=del->v.front();
// cout<<p->val;
delete p;
}
// cout<<"sterg "<<del->val<<" \n";
delete del;
}
}
int frequency()
{
trie *p=head;
for(int i=2, t=0; i<len; ++i)
{
for(it=(p->v.begin()); it!=(p->v.end()); ++it)
{
if((*it)->val==s[i])
{
t=1;
p=*it;
break;
}
}
if(!t)
return 0;
}
return p->freq;
}
int prefix(){
trie *p=head;
for(int i=2; i<len; ++i)
{
t=0;
for(it=(p->v.begin()); it!=(p->v.end()); ++it)
if((*it)->val==s[i])
{
// if((*it)->v.size()>1||(*it)->freq)
// cnt=i-1;
p=*it;
t=1;
break;
}
if(!t){return i-2;}
}
return len-2;
}
int main()
{
while(f.getline(s, 1000))
{
len=strlen(s);
if(s[0]=='0') //cout<<s<<'\n',
update_trie();
if(s[0]=='1')
del_word();
if(s[0]=='2')
g<<frequency()<<'\n';
if(s[0]=='3')
g<<prefix()<<'\n';
}
return 0;
}