Pagini recente » Cod sursa (job #416003) | Cod sursa (job #2650904) | Cod sursa (job #714299) | Cod sursa (job #2708930) | Cod sursa (job #2820096)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
const int INF = 1e9;
struct Trie {
struct Node {
Node *child[30];
int cnt, endWord;
Node() {
for(int i = 0; i <= 26; ++i)
child[i] = NULL;
endWord = cnt = 0;
}
};
Node *root;
Trie () {
root = new Node();
root -> cnt = INF;
}
void Add(char *s) {
int n = (int)strlen(s);
Node *p = root;
for(int i = 0; i < n; i++) {
if(p -> child[s[i] - 'a'] == NULL) {
p -> child[s[i] - 'a'] = new Node();
}
p = p -> child[s[i] - 'a'];
p -> cnt++;
}
p -> endWord++;
}
void Erase(Node *p, char *s) {
p -> cnt--;
if(s[0] == '\0') {
p -> endWord--;
return;
}
Erase(p -> child[s[0] - 'a'], s + 1);
if(p -> child[s[0] - 'a'] -> cnt == 0) {
Node *temp = p -> child[s[0] - 'a'];
delete temp;
p -> child[s[0] - 'a'] = NULL;
}
}
void Erase(char *s) {
Erase(root, s);
}
int Count(char *s) {
int n = (int)strlen(s);
Node *p = root;
for(int i = 0; i < n; ++i)
if(p -> child[s[i] - 'a'] != NULL)
p = p -> child[s[i] - 'a'];
else return 0;
return p -> endWord;
}
int maxP (char *s) {
int n = (int)strlen(s);
Node *p = root;
for(int i = 0; i < n; ++i)
if(p -> child[s[i] - 'a'] != NULL)
p = p -> child[s[i] - 'a'];
else
return i;
return n;
}
};
int main()
{
Trie a;
int op;
while (fin >> op) {
char sir[25]; fin >> sir;
if(op == 0) {
a.Add(sir);
} else if(op == 1) {
a.Erase(sir);
} else if(op == 2) {
fout << a.Count(sir) << "\n";
} else {
fout << a.maxP(sir) << "\n";
}
}
return 0;
}