Pagini recente » Cod sursa (job #98738) | Cod sursa (job #2216968) | Cod sursa (job #1489294) | Cod sursa (job #3230897) | Cod sursa (job #538514)
Cod sursa(job #538514)
#include<stdio.h>
#include<string.h>
#define MOD 100003
#define MAX 100005
#define MAXC 21
FILE*g = fopen("trie.out","w");
char C[MAX][MAXC],var[MAXC];
int H[MOD],V[MAX],N;
int put(int n, int p)
{
int sol = 1;
while(p)
{
if(p%2 != 0){sol*=n;sol%=MOD;--p;}
n*=n;
n%=MOD;
p/=2;
}
return sol;
}
void add(char sir[])
{
int cod,size = strlen(sir),i;
for(i=cod=0;i<size;++i)
{
cod+=put(sir[i],i);
cod%=MOD;
}
if(H[cod])
++V[H[cod]];
else
{
H[cod] = ++N;
strcpy(C[N], sir);
V[N] = 1;
}
}
void erase(char sir[])
{
int cod,size = strlen(sir),i;
for(i=cod=0;i<size;++i)
{
cod+=put(sir[i], i);
cod%=MOD;
}
if(V[H[cod]])
--V[H[cod]];
}
void tipar(char sir[])
{
int cod,size = strlen(sir),i;
for(i=cod=0;i<size;++i)
{
cod+=put(sir[i], i);
cod%=MOD;
}
fprintf(g,"%d\n", V[H[cod]]);
}
void prefix(char sir[])
{
int i,size = strlen(sir),j,max = -MOD;
char aux[MAXC];
strcpy(aux, var);
for(i=1;i<=N;++i)
{
strcpy(aux,sir);
if(V[i]>0&&strcmp(aux, C[i]))
for(j = size;j>=0 && j>max;--j)
{
aux[j] = 0;
if(strstr(C[i], aux) == C[i])max = j;
}
}
fprintf(g,"%d\n",max);
}
int main()
{
FILE*f = fopen("trie.in","r");
char sir[MAXC];
int var;
while(!feof(f))
{
var = -1;
fscanf(f,"%d ",&var);
fscanf(f,"%s", sir);
switch(var)
{
case 0:{add(sir);break;}
case 1:{erase(sir);break;}
case 2:{tipar(sir);break;}
case 3:{prefix(sir);break;}
default:break;
}
}
fclose(f);
fclose(g);
}