Pagini recente » Cod sursa (job #620481) | Cod sursa (job #3145843)
#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 {
char val;
int cnt;
int location;
multiset<string> ends;
map<char, int> fr;
};
vector<vector<Element>> levels = vector<vector<Element>>(30, vector<Element>(26));
void addWord(int level,string::iterator it,string::iterator end,string word) {
int id = toIndex(*it);
levels[level][id].cnt++;
it++;
if (it == end) {
levels[level][id].ends.insert(word);
return;
}
levels[level][id].fr[*it]++;
addWord(level+1, it, end, word);
}
void deleteWord(int level,string::iterator it, string::iterator end, string word) {
int id = toIndex(*it);
levels[level][id].cnt--;
it++;
if (it == end) {
levels[level][id].ends.erase(word);
return;
}
levels[level][id].fr[*it]--;
deleteWord(level+1, it, end, word);
}
int appearances(int level, string::iterator it, string::iterator end,string word) {
int id = toIndex(*it);
if (levels[level][id].cnt == 0)
return 0;
it++;
if (it == end) {
if (levels[level][id].ends.find(word) == levels[level][id].ends.end())
return 0;
return levels[level][id].cnt;
}
int cnt = levels[level][id].fr[*it];
if (cnt == 0)
return 0;
return min(cnt, appearances(level+1, it, end,word));
}
int longestPrefix(int level, string::iterator it, string::iterator end) {
int id = toIndex(*it);
if (levels[level][id].cnt == 0)
return 0;
it++;
if (it == end) {
return levels[level][id].cnt;
}
int cnt = levels[level][id].fr[*it];
if (cnt == 0)
return 1;
return longestPrefix(level + 1, it, end)+1;
}
int main()
{
int i, j, n, nr,k,a;
string s, input;
while (cin >> a>>input) {
/*if (starting[*input.begin()] == 0) {
gdata.push_back({});
gdata[index].val = *input.begin();
gdata[index].location = index;
}*/
switch (a) {
case 0:
addWord(0, input.begin(), input.end(), input);
break;
case 1:
//levels[0][toIndex(*input.begin())].cnt--;
deleteWord(0, input.begin(), input.end(), input);
break;
case 2:
cout<<appearances(0, input.begin(), input.end(),input)<<"\n";
break;
case 3:
cout << longestPrefix(0, input.begin(), input.end()) << "\n";
break;
}
}
return 0;
}