Pagini recente » Cod sursa (job #91197) | Cod sursa (job #3145865)
#include <fstream>
#include<vector>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
multiset<string> ms;
int toIndex(char ch) {
return (int)ch-97;
}
char toChar(int i) {
return (char)(i + 97);
}
int index = 1;
struct Element {
int cnt;
map<string,int> ends;
map<char, int> fr;
map<char, Element> next;
};
vector<vector<Element>> levels = vector<vector<Element>>(30, vector<Element>(26));
map<char, Element> start;
void addWord(Element& e,string::iterator it,string::iterator end,string word) {
int id = toIndex(*it);
e.cnt++;
it++;
if (it == end) {
e.ends[word]++;
return;
}
e.fr[*it]++;
addWord(e.next[*it], it, end, word);
}
void deleteWord(Element& e,string::iterator it, string::iterator end, string word) {
int id = toIndex(*it);
e.cnt--;
it++;
if (it == end) {
e.ends[word]--;
return;
}
e.fr[*it]--;
deleteWord(e.next[*it], it, end, word);
}
int appearances(Element& e, string::iterator it, string::iterator end,string word) {
int id = toIndex(*it);
if (e.cnt == 0)
return 0;
it++;
if (it == end) {
return e.ends[word];
}
int cnt = e.fr[*it];
if (cnt == 0)
return 0;
return appearances(e.next[*it], it, end,word);
}
int longestPrefix(Element& e, string::iterator it, string::iterator end) {
int id = toIndex(*it);
if (e.cnt == 0)
return 0;
it++;
if (it == end) {
return 1;
}
int cnt = e.fr[*it];
if (cnt == 0)
return 1;
return longestPrefix(e.next[*it], it, end) + 1;
}
int main()
{
int i, j, n, nr,k,a;
string s, input;
nr = 0;
while (cin >> a>>input) {
/*if (starting[*input.begin()] == 0) {
gdata.push_back({});
gdata[index].val = *input.begin();
gdata[index].location = index;
}*/
if (a == 2 || a == 3)
nr++;
if (nr == 5241) {
j = 0;
}
switch (a) {
case 0:
addWord(start[*input.begin()], input.begin(), input.end(), input);
break;
case 1:
//levels[0][toIndex(*input.begin())].cnt--;
deleteWord(start[*input.begin()], input.begin(), input.end(), input);
break;
case 2:
cout<<appearances(start[*input.begin()], input.begin(), input.end(),input)<<"\n";
break;
case 3:
cout << longestPrefix(start[*input.begin()],input.begin(), input.end()) << "\n";
break;
}
}
return 0;
}