Pagini recente » Cod sursa (job #2223573) | Cod sursa (job #1595871) | Cod sursa (job #1123460) | Cod sursa (job #750947) | Cod sursa (job #2696043)
#include <bits/stdc++.h>
#define Q ( S[i] - 'a' )
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{int end, son;
Trie *F[26];
Trie()
{end=son=0;
memset(F,0,sizeof(F));
}
};
Trie *T = new Trie;
string S;
void add(Trie *nod, unsigned int i)
{if(i==S.length())
{nod->end++; return;}
if(nod->F[Q]==0)
{nod->F[Q]= new Trie;
nod->son++;
}
add(nod->F[Q], i+1);
}
int del(Trie *nod, unsigned int i)
{if(i==S.length()) nod->end--;
else if(del(nod->F[Q],i+1))
{nod->F[Q] = 0;
nod->son--;
}
if(nod->end==0 && nod->son==0 && nod!=T)
{delete nod; return 1;}
return 0;
}
int query(Trie *nod, unsigned int i)
{if(i==S.length())
return nod->end;
if(nod->F[Q]) return query(nod->F[Q],i+1);
return 0;
}
int prefix(Trie *nod, unsigned int i, int k)
{if(i==S.length() || nod->F[Q]==0)
return k;
return prefix(nod->F[Q],i+1,k+1);
}
int main()
{int q;
while(fin>>q)
{fin>>S;
switch(q)
{case 0: add(T,0); break;
case 1: del(T,0); break;
case 2: fout<<query(T,0)<<'\n'; break;
case 3: fout<<prefix(T,0,0)<<'\n'; break;
}
}
return 0;
}