Pagini recente » Statistici Catalin Margarit (CatalinMargarit) | Cod sursa (job #772945) | Ciorna | Cod sursa (job #1951556) | Cod sursa (job #2394940)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
char str[25];
int nr;
struct trie
{
int cnt,lastcnt,next[30];
}newtrie;
vector<trie>v;
void add(unsigned poz,int nr,int val)//poz in cuvant,poz trie in vector,val=adaugare/stergere
{
v[nr].cnt+=val;
if(poz==strlen(str))
{
v[nr].lastcnt+=val;
return;
}
if(!v[nr].next[str[poz]-'a'])
{
v.push_back(newtrie);
v[nr].next[str[poz]-'a']=v.size()-1;
}
add(poz+1,v[nr].next[str[poz]-'a'],val);
}
int query1(unsigned poz,int nr)//pozitia literei in cuvant si pozitia trie in vector
{
if(poz==strlen(str))
return v[nr].lastcnt;
if(v[nr].next[str[poz]-'a']!=0)
return query1(poz+1,v[nr].next[str[poz]-'a']);
return 0;
}
int query2(unsigned poz,int nr)
{
if(poz==strlen(str))
return bool(v[nr].cnt)*poz;
if(!v[nr].cnt)
return max(poz-1,(unsigned)0);
if(v[nr].next[str[poz]-'a'])
return query2(poz+1,v[nr].next[str[poz]-'a']);
return poz;
}
int main()
{
v.push_back(newtrie);
while(in>>nr>>str)
{
if(nr==0)
add(0,0,1);
else if(nr==1)
add(0,0,-1);
else if(nr==2)
out<<query1(0,0);
else
out<<query2(0,0);
}
return 0;
}