Pagini recente » Cod sursa (job #56688) | Cod sursa (job #2782440) | Cod sursa (job #2455129) | Cod sursa (job #2064840) | Cod sursa (job #2746514)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int operation;
string s;
struct trie
{
int ct;
int nrfii;
trie* fii[27];
trie()
{
ct=0;
nrfii=0;
for(int i=1; i<=26; i++)
fii[i]=0;
}
};
trie *myTrie=new trie;
void add(trie *nod,int ind)
{
if( ind==s.length() )
{
++nod->ct;
return;
}
int ch=s[ind]-'a'+1;
if( nod->fii[ch]==NULL )
{
++nod->nrfii;
nod->fii[ch]=new trie;
}
add(nod->fii[ch],ind+1);
}
bool cut(trie *nod,int ind)
{
if( ind==s.length() )
--nod->ct;
else if( cut(nod->fii[s[ind]-'a'+1],ind+1) )
{
--nod->nrfii;
nod->fii[s[ind]-'a'+1]=0;
}
if( nod!=myTrie && nod->ct==0 && nod->nrfii==0 )
{
delete nod;
return 1;
}
return 0;
}
int get(trie *nod,int ind)
{
if( ind==s.length() )
return nod->ct;
if( nod->fii[s[ind]-'a'+1]==NULL )
return 0;
return get(nod->fii[s[ind]-'a'+1],ind+1);
}
int maxpref(trie *nod,int ind)
{
if( ind==s.length() )
return 0;
if( nod->fii[s[ind]-'a'+1]==NULL )
return 0;
return 1+maxpref(nod->fii[s[ind]-'a'+1],ind+1);
}
int main()
{
while(f>>operation>>s)
{
if( operation==0 )
{
add(myTrie,0);
}
if( operation==1 )
{
cut(myTrie,0);
}
if( operation==2 )
{
g<<get(myTrie,0)<<'\n';
}
if( operation==3 )
{
g<<maxpref(myTrie,0)<<'\n';
}
}
}