Pagini recente » Borderou de evaluare (job #2848101) | Cod sursa (job #2988537)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout ("trie.out");
struct nod
{
int cnt;
int last;
nod *f[30];
};
nod* create(){
nod *nou = new nod;
int i;
nou->cnt = 0;
nou->last = 0;
for (i=0;i<26;i++)
nou->f[i] = NULL;
return nou;
}
void add(nod *r, string s){
for(int i=0; s[i]; i++){
char x = s[i];
int v = x - 'a';
if(!r->f[v])
r->f[v] = create();
r = r->f[v];
r->cnt++;
}
r->last++;
}
void erase(nod *r, string s){
for(int i=0; s[i]; i++){
char x = s[i];
int v = x - 'a';
r = r->f[v];
r->cnt--;
}
r->last--;
}
int app(nod *r,string s){
for(int i=0; s[i]; i++){
char x = s[i];
int v = x - 'a';
if(!r->f[v])
return 0;
r = r->f[v];
if(r->cnt == 0)
return 0;
}
return r->last;
}
int lcp(nod *r, string s){
int ans=0;
for(int i=0; s[i]; i++){
char x = s[i];
int v = x - 'a';
if(!r->f[v])
return ans;
r = r->f[v];
if(r->cnt == 0)
return ans;
ans++;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(0); fout.tie(0);
int t;
nod *rad = create();
while(fin >> t){
string s;
fin >> s;
if(t == 0)
add(rad, s);
else if(t == 1)
erase(rad, s);
else if(t == 2)
fout << app(rad, s) << '\n';
else if(t == 3)
fout << lcp(rad, s) << '\n';
}
return 0;
}