Pagini recente » Cod sursa (job #2084860) | Cod sursa (job #446121) | Cod sursa (job #1916274) | Cod sursa (job #2069493) | Cod sursa (job #833104)
Cod sursa(job #833104)
#include <cstdio>
#include <cstring>
#include <vector>
#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];
vector<int> gf[nmax];
void adauga(int st){
int rad = 1;
int i , j;
for(i=st; i<=L; i++){
int ok = 0;
for(int k=0; k<gf[rad].size(); ++k){
j = gf[rad][k];
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;
*/
gf[rad].push_back(N);
rad = N;
}
}
}
void sterge(int st){
int rad = 1;
for(int i=st; i<=L; i++){
int ok = 0;
for(int k=0; k<gf[rad].size(); ++k){
int j = gf[rad][k];
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 k=0; k<gf[rad].size(); ++k){
int j = gf[rad][k];
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 k=0; k<gf[rad].size(); ++k){
int j = gf[rad][k];
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;
}