Pagini recente » Cod sursa (job #415066) | Propuneri infoarena | Cod sursa (job #1073840) | Cod sursa (job #727076)
Cod sursa(job #727076)
#include <fstream>
#include <cstring>
#define SG 27
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int o;
string In;
struct Trie {
int words,son;
Trie *Son[SG];
Trie() {
words=son=0;
memset(Son,0,sizeof(Son));
}
} *T=new Trie;
void Add(Trie *Nod,int p) {
if (p==(int)In.size()) {
Nod->words++;
return;
}
if (Nod->Son[In[p]-'a']==NULL) {
Nod->Son[In[p]-'a']=new Trie;
Nod->son++;
}
Add(Nod->Son[In[p]-'a'],p+1);
}
bool Delete(Trie *Nod,int p) {
if (p==(int)In.size()) {
Nod->words--;
}
else {
if (Delete(Nod->Son[In[p]-'a'],p+1)) {
Nod->Son[In[p]-'a']=NULL;
Nod->son--;
}
}
if (Nod->words==0 && Nod->son==0 && Nod!=T) {
delete Nod;
return true;
}
return false;
}
int Count(Trie *Nod,int p) {
if (p==(int)In.size()) return Nod->words;
if (Nod->Son[In[p]-'a']==NULL) return 0;
return Count(Nod->Son[In[p]-'a'],p+1);
}
int Prefix(Trie *Nod,int p,int k) {
if (p==(int)In.size()) return k;
if (Nod->Son[In[p]-'a']==NULL) return k;
return Prefix(Nod->Son[In[p]-'a'],p+1,k+1);
}
int main() {
while (f >> o >> In) {
if (o==0) Add(T,0);
if (o==1) Delete(T,0);
if (o==2) g << Count(T,0) << '\n';
if (o==3) g << Prefix(T,0,0) << '\n';
}
f.close();g.close();
return 0;
}