Pagini recente » Cod sursa (job #1766666) | Cod sursa (job #298093) | Cod sursa (job #1714083) | Cod sursa (job #3128730) | Cod sursa (job #3146874)
#include <bits/stdc++.h>
using namespace std;
string sir;
struct trie
{
int nrcuv = 0, fr = 0;
trie * kinder[30];
trie()
{
for(int i = 0; i <= 26; ++i)
{
kinder[i] = NULL;
}
}
};
trie * add(trie * nod, int val)
{
if(nod == NULL)
{
nod = new trie;
}
nod->fr++;
if(val == sir.size())
{
nod->nrcuv++;
return nod;
}
nod->kinder[sir[val] - 'a'] = add(nod->kinder[sir[val] - 'a'], val + 1);
return nod;
}
trie * del(trie * nod, int val)
{
nod->fr--;
if(val == sir.size())
{
nod->nrcuv--;
}
else
{
nod->kinder[sir[val] - 'a'] = del(nod->kinder[sir[val] - 'a'], val + 1);
}
if(nod->fr == 0)
{
nod = NULL;
}
return nod;
}
int freq(trie * nod, int val)
{
if(nod == NULL)
{
return 0;
}
if(val == sir.size())
{
return nod->nrcuv;
}
return freq(nod->kinder[sir[val] - 'a'], val + 1);
}
int lcp(trie * nod, int val)
{
if(nod == NULL)
{
return -1;
}
if(val == sir.size())
{
return 0;
}
return 1 + lcp(nod->kinder[sir[val] - 'a'], val + 1);
}
int tip;
trie *p = NULL;
ifstream fin("trie.in");
ofstream fout("trie.out");
int32_t main(int argc, char * argv[])
{
while(fin >> tip >> sir)
{
if(tip == 0)
{
p = add(p, 0);
}
if(tip == 1)
{
p = del(p, 0);
}
if(tip == 2)
{
fout << freq(p, 0) << '\n';
}
if(tip == 3)
{
fout << lcp(p, 0) << '\n';
}
}
return 0;
}