Pagini recente » Cod sursa (job #530419) | Cod sursa (job #2135518) | Cod sursa (job #2374288) | Cod sursa (job #156223) | Cod sursa (job #2737042)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int count_words,count_prefixes,next_indice[31];
}zero;
vector<trie>v;
int n,t;
char s[101];
void update(int poz_trie, int poz_string, int val)
{
v[poz_trie].count_prefixes+=val;
if(poz_string==n)v[poz_trie].count_words+=val;
else
{
int val_next_indice=s[poz_string]-'a'+1;
if(v[poz_trie].next_indice[val_next_indice]==0)
{
t++;
v.push_back(zero);
v[poz_trie].next_indice[val_next_indice]=t;
}
update(v[poz_trie].next_indice[val_next_indice],poz_string+1,val);
}
}
int query1()
{
int poz_trie=0;
for(int i=0;i<n;i++)
{
int val_next_indice=s[i]-'a'+1;
if(v[poz_trie].next_indice[val_next_indice]==0)return 0;
poz_trie=v[poz_trie].next_indice[val_next_indice];
}
return v[poz_trie].count_words;
}
int query2()
{
int poz_trie=0;
for(int i=0;i<n;i++)
{
int val_next_indice=s[i]-'a'+1;
if(v[poz_trie].next_indice[val_next_indice]==0 || v[v[poz_trie].next_indice[val_next_indice]].count_prefixes<=0)return i;
poz_trie=v[poz_trie].next_indice[val_next_indice];
}
return n;
}
int c;
int main()
{
v.push_back(zero);t=0;
while(f>>c>>s)
{
n=strlen(s);
if(c==0)update(0,0,1);
else if(c==1)update(0,0,-1);
else if(c==2)g<<query1()<<'\n';
else if(c==3)g<<query2()<<'\n';
}
return 0;
}