Pagini recente » Cod sursa (job #950573) | Cod sursa (job #2759656) | Cod sursa (job #2859915) | Cod sursa (job #1615738) | Cod sursa (job #2553628)
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct node{
node *copii[26] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
int val = 0, numberOfChildren = 0;
}*tree = new node();
void insertie(string s){
node* leaf = tree;
for (int i = 0; i < s.length(); ++i) {
if(leaf->copii[int(s[i] - 'a')] == nullptr){
leaf->copii[int(s[i] - 'a')] = new node();
leaf->numberOfChildren++;
}
leaf = leaf->copii[int(s[i] - 'a')];
}
leaf->val++;
}
bool deleter(node* &leaf, char word[]){
if(leaf->copii[int(word[0] - 'a')] != nullptr)
(deleter(leaf->copii[int(word[0] - 'a')], word + 1)) ? leaf->numberOfChildren-- : NULL;
if(leaf->val > 0 && strlen(word) == 0){
leaf->val--;
}
if(leaf->numberOfChildren == 0 && leaf->val == 0){
delete leaf;
leaf = nullptr;
return true;
}
return false;
}
int howManyTimes(string s){
node* leaf = tree;
for (int i = 0; i < s.length(); ++i) {
if(leaf->copii[int(s[i] - 'a')] == nullptr)
return 0;
else leaf = leaf->copii[int(s[i] - 'a')];
}
return leaf->val;
}
int longestPrefix(string s){
int longest = 0;
node* leaf = tree;
for (int i = 0; i < s.length(); ++i) {
if(leaf->copii[int(s[i] - 'a')] == nullptr)
return i;
else{
if(leaf->numberOfChildren > 1)
longest = i;
leaf = leaf->copii[int(s[i] - 'a')];
}
}
return longest;
}
int main() {
string s;
int op;
while(f>>op>>s){
switch(op){
case 0:{
insertie(s);
break;
}
case 1:{
char word[21];
strcpy(word, s.c_str());
deleter(tree, word);
break;
}
case 2:{
g<<howManyTimes(s)<<"\n";
break;
}
case 3:{
g<<longestPrefix(s)<<"\n";
break;
}
default: break;
}
}
f.close();
g.close();
return 0;
}