Pagini recente » Cod sursa (job #1503492) | Cod sursa (job #972495) | Cod sursa (job #1151247) | Cod sursa (job #2255751) | Cod sursa (job #712748)
Cod sursa(job #712748)
#include <cstdio>
#include <cstring>
#define nmax 200006*26
#define wmax 22
using namespace std;
struct camp{
int Fiu, Frate, Prefix, Cuvant;
char c;
}T[nmax];
int rez, L, aux, N=1;
char s[wmax];
void adauga(int st){
int rad = 1;
int i , j;
for(i=st; i<=L; i++){
int ok = 0;
for(j=T[rad].Fiu; j; j=T[j].Frate){
if (s[i] == T[j].c){
ok = 1;
++T[j].Prefix;
if (i == L) ++T[j].Cuvant;
rad = j;
break;
}
else aux = j;
}
if (ok == 0){
++N;
T[N].c = s[i];
++T[N].Prefix;
if (i == L) ++T[N].Cuvant;
if (T[rad].Fiu == 0) T[rad].Fiu = N;
else T[aux].Frate = N;
rad = N;
}
}
}
void sterge(int st){
int rad = 1;
for(int i=st; i<=L; i++){
int ok = 0;
for(int j=T[rad].Fiu; j; j=T[j].Frate){
if (s[i] == T[j].c){
ok = 1;
--T[j].Prefix;
if (i == L) --T[j].Cuvant;
rad = j;
break;
}
}
}
}
int Ap_cuvant(int st){
int rad = 1;
for(int i=st; i<=L; i++){
int ok = 0;
for(int j=T[rad].Fiu; j; j = T[j].Frate){
if (s[i] == T[j].c && T[j].Prefix){//daca nu l`am mai sters !!!
ok = 1;
if (i == L) return T[j].Cuvant;
rad = j;
break;
}
}
if (ok == 0) return 0;
}
}
int Lung_max(int st){
int rad = 1;
for(int i=st; i<=L; i++){
int ok = 0;
for(int j=T[rad].Fiu; j; j=T[j].Frate){
if (s[i] == T[j].c && T[j].Prefix){
ok = 1;
++rez;
if (i == L) return rez;
rad = j;
}
}
if (ok == 0) return rez;
}
return rez;
}
int main(){
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while ( fgets(s, wmax, stdin) ){
L = strlen(s) - 2;
rez = 0;
if (s[0] == '0') adauga(2);
else if(s[0] == '1') sterge(2);
else if(s[0] == '2') printf("%d\n", Ap_cuvant(2));
else if(s[0] == '3') Lung_max(2), printf("%d\n", rez);
}
fclose(stdin);
fclose(stdout);
return 0;
}