Pagini recente » Cod sursa (job #1590670) | Cod sursa (job #2743512) | Cod sursa (job #275524) | Cod sursa (job #2724728) | Cod sursa (job #1751642)
#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> go;
int ID = 1;
trie(int S) {
tr.resize(S);
for(int i = 0; i < tr.size(); i++)
tr[i].resize(30);
en.resize(S);
go.resize(S);
}
void add(string s) {
int C = 1;
for(int i = 0; i < s.size(); i++) {
if(tr[C][s[i]-'a'] == 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(20*100003));
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;
}