Pagini recente » Cod sursa (job #2364554) | Cod sursa (job #2367044) | Implica-te! | Cod sursa (job #83491) | Cod sursa (job #108520)
Cod sursa(job #108520)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct node
{
node *f[3], *next[3];
bool end;
};
void add(node **nod, char *s);
void go(node *nod, node **R, int lim);
char S[10000001];
int N;
node *root, *X;
int main()
{
char s[32];
int nr = 0;
freopen("abc2.in", "r", stdin);
freopen("abc2.out", "w", stdout);
fgets(S, 10000001, stdin);
while(!feof(stdin))
{
scanf("%s ", s);
add(&root, s);
}
node **u;
u = new node*[1];
u[0] = root;
go(root, u, 1);
X = root;
S[strlen(S) - 1] = 0;
N = strlen(S);
for(int i = 0; i < N; i++)
{
X = X->next[S[i] - 'a'];
if(X->end)
nr++;
}
printf("%d\n", nr);
return 0;
}
void add(node **nod, char *s)
{
if((*nod) == 0)
{
*nod = new node;
(*nod)->f[0] = (*nod)->f[1] = (*nod)->f[2] = 0;
if(s[0] == 0) (*nod)->end = true;
else
(*nod)->end = false, add(&((*nod)->f[s[0] - 'a']), s + 1);
}
else
{
if(s[0] == 0)(*nod)->end = true;
else
(*nod)->end = false, add(&((*nod)->f[s[0] - 'a']), s + 1);
}
}
void go(node *nod, node **R, int lim)
{
int i, j;
for(j = 0; j < 3; j++)
{
nod->next[j] = root;
if(nod->f[j])
{
nod->next[j] = nod->f[j];
continue;
}
for(i = lim - 1; i >= 0; i--)
if(R[i]->f[j] != 0)
{
nod->next[j] = R[i]->f[j];
break;
}
}
node **A[3];
int u[3];
for(j = 0; j < 3; j++)
if(nod->f[j])
{
u[j] = 0;
u[j]++;
for(i = 0; i < lim; i++)
if(R[i]->f[j])
u[j]++;
A[j] = new node*[u[j]];
u[j] = 0;
A[j][u[j]++] = root;
for(i = 0; i < lim; i++)
if(R[i]->f[j])
A[j][u[j]++] = R[i]->f[j];
}
free(R);
for(j = 0; j < 3; j++)
if(nod->f[j])
go(nod->f[j], A[j], u[j]);
}