Pagini recente » Cod sursa (job #1548568) | Cod sursa (job #353367) | Cod sursa (job #129280) | Cod sursa (job #967929) | Cod sursa (job #681140)
Cod sursa(job #681140)
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define MarimeAlfabet 'z' - 'a'
#define c2i(ch) ch - 'a'
typedef struct NOD{
int nrCuvinteTerminate;
int nrCuvinteCuAcestPrefix;
struct NOD* next[MarimeAlfabet];
}NOD;
void initializare_nod(NOD *p)
{
p = new NOD;
//p->next = new NOD*[MarimeAlfabet];
}
void insereaza(NOD* T, string s)
{
unsigned int i;
NOD *q, *p;
q = T;
for (i=0; i<s.length(); i++){
if (!q->next[c2i(s[i])]){
p = new NOD;
for (int j=0; j<MarimeAlfabet; j++) p->next[j] = NULL;
p->nrCuvinteCuAcestPrefix = 0;
p->nrCuvinteTerminate = 0;
q->next[c2i(s[i])] = p;
}
q = q->next[c2i(s[i])];
q->nrCuvinteCuAcestPrefix++;
}
q->nrCuvinteTerminate++;
}
void sterge(NOD* T, string s)
{
unsigned int i;
NOD *q;
q = T;
for (i=0; i<s.length(); i++){
q = q->next[c2i(s[i])];
q->nrCuvinteCuAcestPrefix--;
}
q->nrCuvinteTerminate--;
}
int NRaparitii(NOD* T, string s)
{
unsigned int i;
NOD *q;
q = T;
for (i=0; i<s.length(); i++){
q = q->next[c2i(s[i])];
}
return q->nrCuvinteTerminate;
}
int CMLprefix(NOD* T, string s)
{
unsigned int i;
NOD *q;
q = T;
for (i=0; q && i<s.length() && q->next[c2i(s[i])] && q->next[c2i(s[i])]->nrCuvinteCuAcestPrefix; i++){
q = q->next[c2i(s[i])];
}
return i;
}
int main()
{
NOD *T;
T = new NOD;
for (int i=0; i<MarimeAlfabet; i++) T->next[i] = NULL;
int c;
string s;
f >> c >> s;
while (!f.eof()){
if (c==0) insereaza(T,s); else
if (c==1) sterge(T,s); else
if (c==2) g << NRaparitii(T,s) << '\n'; else
if (c==3) g << CMLprefix(T,s) << '\n';
f >> c >> s;
}
return 0;
}