Pagini recente » Cod sursa (job #130720) | Cod sursa (job #1255577) | Cod sursa (job #310470) | Cod sursa (job #2117223) | Cod sursa (job #3004190)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int c, cnt; char s[21];
bool ok = true;
struct trie{
trie * nxt[26] = {NULL};
int nr;
};
trie * root = new trie;
int conv(char a){return a-97;}
void cer0(trie* r, int i){
if(i < strlen(s)){
if(!r->nxt[conv(s[i])])
r->nxt[conv(s[i])] = new trie;
cer0(r->nxt[conv(s[i])], i+1);
}
else r->nr++;
}
void cer1(trie* r, int i){
if(i < strlen(s)){
if(r->nxt[conv(s[i])])
cer1(r->nxt[conv(s[i])], i+1);
}
else r->nr--;
}
void cer2(trie* r, int i){
if(i < strlen(s)){
if(r->nxt[conv(s[i])])
cer2(r->nxt[conv(s[i])], i+1);
}
else fout<<r->nr<<"\n";
}
bool src(trie * r){
if(r->nr>0) return 1;
bool found = false;
for(int i=0; i<26; i++){
if(r->nxt[i]) found = src(r->nxt[i]);
if(found) return 1;
}
return 0;
}
void cer3(trie* r, int i){ if(ok){
if(i < strlen(s)){
if(r->nxt[conv(s[i])])
cer3(r->nxt[conv(s[i])], i+1);
}
if(i<strlen(s) && r->nr){
ok = false;
cnt = i+1;
}
for(int j=0; j<26; j++){
if(r->nxt[j] && j!=conv(s[i])){
if(src(r->nxt[j])){
ok = false;
cnt = i+1;
}
}
}
}
}
int main(){
while(fin>>c>>s){
if(c==0) cer0(root, 0);
if(c==1) cer1(root, 0);
if(c==2) cer2(root, 0);
if(c==3) {cnt=0; ok = true; cer3(root, 0); fout<<cnt<<"\n";}
}
}