Mai intai trebuie sa te autentifici.
Cod sursa(job #1741960)
Utilizator | Data | 15 august 2016 15:45:08 | |
---|---|---|---|
Problema | Trie | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.3 kb |
#include <fstream>
#include <cstring>
#define q (*c-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int tip;
char cuv[30];
struct Trie
{
int nrc,nr_;
Trie *S[26];
Trie()
{
nrc=nr_=0;
memset(S,0,sizeof S);
}
};
Trie *T=new Trie;
inline bool ok(char x)
{
return x<'a'||x>'z';
}
inline void ins(Trie *nod,char *c)
{
if(ok(*c))
{
nod->nrc++;
return;
}
if(!nod->S[q])
{
nod->S[q]=new Trie;
nod->nr_++;
}
ins(nod->S[q],c+1);
}
inline bool del(Trie *nod,char *c)
{
if(ok(*c)) nod->nrc--;
else if(del(nod->S[q],c+1))
{
nod->nr_--;
nod->S[q]=0;
}
if(!nod->nrc&&!nod->nr_&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
inline int ans(Trie *nod,char *c)
{
if(ok(*c)) return nod->nrc;
if(nod->S[q]) return ans(nod->S[q],c+1);
return 0;
}
inline int pref(Trie *nod,char *c,int k)
{
if(ok(*c)||!nod->S[q]) return k;
return pref(nod->S[q],c+1,k+1);
}
int main()
{
while(f>>tip>>cuv)
{
if(tip==0) ins(T,cuv);
else if(tip==1) del(T,cuv);
else if(tip==2) g<<ans(T,cuv)<<'\n';
else g<<pref(T,cuv,0)<<'\n';
}
return 0;
}