Pagini recente » Cod sursa (job #721919) | Cod sursa (job #2289006) | Cod sursa (job #658446) | Cod sursa (job #1568815) | Cod sursa (job #1751638)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie {
vector<vector<int>> tr;
vector<int> en;
vector<int> ds;
vector<int> go;
int ID = 1;
trie() {
tr.resize(2);
ds.resize(30);
en.resize(2);
go.resize(2);
tr[1] = ds;
}
void add(string s) {
int C = 1;
for(int i = 0; i < s.size(); i++) {
if(tr[C][s[i]-'a'] == 0) {
tr.push_back(ds);
en.push_back(0);
go.push_back(0);
tr[C][s[i]-'a'] = ++ID;
C = ID;
} else
C = tr[C][s[i]-'a'];
go[C]++;
}
en[C]++;
}
void rem(string s) {
int C = 1;
for(int i = 0; i < s.size(); i++) {
if(tr[C][s[i]-'a'] == 0)
return;
C = tr[C][s[i]-'a'];
go[C]--;
}
en[C]--;
}
int ap(string s) {
int C = 1;
for(int i = 0; i < s.size(); i++) {
if(tr[C][s[i]-'a'] == 0)
return 0;
C = tr[C][s[i]-'a'];
if(go[C] <= 0)
return 0;
}
return en[C];
}
int ln(string s) {
int C = 1;
for(int i = 0; i < s.size(); i++) {
if(tr[C][s[i]-'a'] == 0)
return i;
C = tr[C][s[i]-'a'];
if(go[C] <= 0)
return i;
}
return s.size();
}
};
int T = 0;
int main() {
int t;
string S;
trie T = *(new trie());
while(in >> t) {
in >> S;
if(t == 0)
T.add(S);
if(t == 1)
T.rem(S);
if(t == 2)
out << T.ap(S) << '\n';
if(t == 3)
out << T.ln(S) << '\n';
}
return 0;
}