Pagini recente » Cod sursa (job #3347325) | Cod sursa (job #1758644) | Cod sursa (job #1223622) | Diferente pentru todo/editoriale intre reviziile 5 si 2 | Cod sursa (job #3330098)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
Nod *v[26];
int cntfii, cnt;
Nod ()
{
for(int i = 0; i <= 25; i++)
v[i] = NULL;
cntfii = cnt = 0;
}
}*root = new Nod;
void Insert(Nod *n, string &a, int p)
{
if(p==a.size())
{
n->cnt++;
return;
}
if(n->v[a[p]-'a']==NULL)
{
n->v[a[p]-'a'] = new Nod;
n->cntfii++;
}
Insert(n->v[a[p]-'a'],a,p+1);
}
void Erase(Nod *n, string &a, int p)
{
if(p==a.size())
{
n->cnt--;
return;
}
if(n->v[a[p]-'a']==NULL)
{
return;
}
Erase(n->v[a[p]-'a'],a,p+1);
if(n->v[a[p]-'a']->cnt==0 && n->v[a[p]-'a']->cntfii==0)
{
delete n->v[a[p]-'a'];
n->v[a[p]-'a']=NULL;
n->cntfii--;
}
}
int Count(Nod *n, string &a, int p)
{
if(p==a.size())
{
return n->cnt;
}
if(n->v[a[p]-'a']==NULL)
{
return 0;
}
return Count(n->v[a[p]-'a'], a, p+1);
}
int Lcp(Nod *n, string &a, int p)
{
if(p==a.size())
{
return p;
}
if(n->v[a[p]-'a']==NULL)
{
return p;
}
return Lcp(n->v[a[p]-'a'], a, p+1);
}
int main()
{
int q, task;
string s;
while(fin>>task>>s)
{
if(task == 0)
{
Insert(root,s,0);
}
else if(task == 1)
{
Erase(root,s,0);
}
else if(task == 2)
{
fout << Count(root,s,0) << "\n";
}
else if(task == 3)
{
fout << Lcp(root,s,0) << "\n";
}
}
return 0;
}