Pagini recente » Cod sursa (job #1471751) | Cod sursa (job #1547052) | Cod sursa (job #1108386) | Cod sursa (job #405426) | Cod sursa (job #658638)
Cod sursa(job #658638)
#include<cstdio>
#include<vector>
#define MOD 13
using namespace std;
struct word { int val, child; char lit; vector <word> H[MOD]; } start, *ramif;
vector <word> nul[MOD];
char w[21], pre[21];
int nrLit, nrLitRamif;
word * Parcurgere() {
int i, j, ind;
word *nodC = &start;
for(i = 0; w[i]; i++) {
bool iesi = true;
ind = (w[i] - 'a') % MOD;
if(nodC->child > 1) ramif = nodC, nrLitRamif = i;
for(j = 0; j < (int) nodC->H[ind].size(); j++)
if(nodC->H[ind][j].lit == w[i]) { nodC = &nodC->H[ind][j]; iesi = false; break; }
if(iesi) break;
}
nrLit = i;
return nodC;
}
void Insert() {
int i, ind;
word *nodN, *nodC = Parcurgere();
for(i = nrLit; w[i]; i++) {
nodN = new word;
ind = (w[i] - 'a') % MOD;
nodN->val = 0;
nodN->lit = w[i];
nodN->child = 0;
nodC->H[ind].push_back(*nodN);
nodC->child++;
nodC = &nodC->H[ind][nodC->H[ind].size() - 1];
}
nodC->val++;
}
void Delete() {
int i, ind;
word *nodC = Parcurgere();
if(--nodC->val == 0) {
ind = (w[nrLitRamif] - 'a') % MOD;
for(i = 0; i < (int) ramif->H[ind].size(); i++)
if(ramif->H[ind][i].lit == w[nrLitRamif]) {
word aux = ramif->H[ind][i];
int n = ramif->H[ind].size() - 1;
ramif->H[ind][i] = ramif->H[ind][n];
ramif->H[ind][n] = aux;
}
ramif->H[ind].pop_back();
}
}
void Print() {
word *nodC = Parcurgere();
printf("%d\n", nodC->val);
}
void Prefix() {
word *nodC = Parcurgere();
printf("%d\n", nrLit);
}
int main() {
int tip;
freopen("trie.in", "r", stdin), freopen("trie.out", "w", stdout);
while(scanf("%d %s", &tip, w) != EOF) {
if(tip == 0)
Insert();
if(tip == 1)
Delete();
if(tip == 2)
Print();
if(tip == 3)
Prefix();
}
return 0;
}