Pagini recente » Cod sursa (job #1616344) | Cod sursa (job #1716997) | Cod sursa (job #3256568) | Cod sursa (job #791888) | Cod sursa (job #2305433)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
FILE*si=fopen("trie.in", "r");
FILE*so=fopen("trie.out", "w");
struct trie {
int number;
int children;
vector<pair<char, trie*> > next;
trie() {
number=children=0;
}
}*start;
int trie_prefix(trie *nod, char *str) {
int pos = 0;
while(*str!='\n') {
vector<pair<char, trie*> >::iterator it;
for(it=nod->next.begin(); it!=nod->next.end(); ++it)
if(it->first==*str)
break;
if(it==nod->next.end())
break;
nod=it->second;
str++;
pos++;
}
return pos;
}
int trie_count(trie *nod, char *str) {
while(*str!='\n') {
vector<pair<char, trie*> >::iterator it;
for(it=nod->next.begin(); it!=nod->next.end(); ++it)
if(it->first==*str)
break;
if(it==nod->next.end())
return 0;
nod=it->second;
str++;
}
return nod->number;
}
bool trie_delete(trie *nod, char *str) {
if(*str=='\n')
nod->number--;
else {
vector<pair<char, trie*> >::iterator it;
for(it=nod->next.begin(); it!=nod->next.end(); ++it)
if(it->first==*str)
break;
if(trie_delete(it->second, str+1)) {
nod->children--;
nod->next.erase(it);
}
}
if(nod->children==0&&nod->number==0&&nod!=start) {
delete nod;
return true;
}
return false;
}
void trie_insert(trie *nod, char *str) {
while(*str!='\n') {
vector<pair<char, trie*> >::iterator it;
for(it=nod->next.begin(); it!=nod->next.end(); ++it)
if(it->first==*str)
break;
if(it==nod->next.end()) {
nod->next.push_back(make_pair(*str, new trie));
nod->children++;
nod=nod->next.back().second;
}
else
nod=it->second;
str++;
}
nod->number++;
}
int main() {
start = new trie;
char str[32];
while(fgets(str, 32, si)) {
switch(str[0]) {
case '0': trie_insert(start, str+2); break;
case '1': trie_delete(start, str+2); break;
case '2': fprintf(so, "%i\n", trie_count(start, str+2)); break;
case '3': fprintf(so, "%i\n", trie_prefix(start, str+2)); break;
default: return 0;
}
}
return 0;
}