Pagini recente » Cod sursa (job #945595) | Cod sursa (job #919215) | Cod sursa (job #1597694) | Cod sursa (job #25470) | Cod sursa (job #3293796)
#include <fstream>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct noduri {
int cnt;
int fii;
noduri *v[27];
noduri() {
cnt = 0;
fii = 0;
for(int i = 0; i < 26; i++)
v[i] = NULL;
}
};
noduri *radacina;
///prima pos neparcursa
void add_dfs(noduri *start, string &s, int pos) {
if(pos == s.size()) {
start->cnt++;
return;
}
if(start->v[s[pos] - 'a'] == NULL) {
start->v[s[pos] - 'a'] = new noduri;
start->fii++;
}
add_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}
bool del_dfs(noduri *start, string &s, int pos) { ///true--> am sters
if(pos == s.size()) {
start->cnt--;
if(!start->cnt && !start->fii && start != radacina) {
delete start;
return true;
}
return false;
}
if(del_dfs(start->v[s[pos] - 'a'], s, pos + 1)) { ///dc am sters
start->v[s[pos] - 'a'] = NULL;
start->fii--;
if(!start->cnt && !start->fii && start != radacina) {
delete start;
return true;
}
return false;
}
return false;
}
int ap_dfs(noduri *start, string &s, int pos) {
if(pos == s.size())
return start->cnt;
if(start->v[s[pos] - 'a'] == NULL) ///nu exista
return 0;
return ap_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}
int maxx = 0;
void pref_dfs(noduri *start, string &s, int pos) {
if(start->v[s[pos] - 'a'] == NULL || pos == s.size())
return;
maxx = max(maxx, pos + 1);
pref_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}
int main()
{
radacina = new noduri;
int tip;
string s;
while(cin >> tip >> s) {
if(tip == 0)
add_dfs(radacina, s, 0);
else if(tip == 1)
del_dfs(radacina, s, 0);
else if(tip == 2)
cout << ap_dfs(radacina, s, 0) << '\n';
else if(tip == 3) {
maxx = 0;
pref_dfs(radacina, s, 0);
cout << maxx << '\n';
}
}
return 0;
}
/*
0 w - adauga o aparitie a cuvantului w in lista
1 w - sterge o aparitie a cuvantului w din lista
2 w - tipareste numarul de aparitii ale cuvantului w in lista
3 w - tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
*/