Pagini recente » Cod sursa (job #2883285) | Cod sursa (job #2693916) | Cod sursa (job #980909) | Cod sursa (job #89925) | Cod sursa (job #172320)
Cod sursa(job #172320)
#include <stdio.h>
#include <string.h>
#define maxl 50010
#include <algorithm>
using namespace std;
char text[10000010];
char a[maxl][25];
char cuvant[25];
unsigned int nr[maxl];
int ind[25];
int n,m,i,j,x,k,p,q,r,gas,nrsol;
int main()
{
freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);
scanf("%s\n",text);
n=0;
while (!feof(stdin))
{
n++;
scanf("%s",a[n]);
ind[strlen(a[n])]++;
}
n--;ind[0]=0;
for (i=20; i>=1; i--)
ind[i]=ind[i-1];
for (i=2; i<=20; i++)
ind[i]+=ind[i-1];
for (i=20; i>=1; i--)
ind[i]=ind[i-1];
for (i=1; i<=n; i++)
{
x=strlen(a[i]);
ind[x]++;k=1;
for (j=x-1; j>=0; j--)
{
nr[ind[x]]+=k*(a[i][j]-96);
k=k*27;
}
}
for (i=1; i<=20; i++)
if (ind[i]>ind[i-1])
sort(nr+ind[i-1]+1,nr+ind[i]+1);
x=strlen(text);
for (i=1; i<=20; i++)
if (ind[i]!=ind[i-1])
{
k=1;m=0;
for (j=i-1; j>=0; j--)
{
m=m+k*(text[j]-96);
if (j!=0) k*=27;
}
p=ind[i-1];q=ind[i]+1;
while (p+1<q)
{
r=(p+q)/2;
if (nr[r]>m) q=r;
else if (nr[r]<m) p=r;
else {gas=1;break;}
}
if (gas) nrsol++;
for (j=i; j<=x-1; j++)
{
gas=0;
m=m-(text[j-i]-96)*k;
m=m*27+text[j]-96;
p=ind[i-1];q=ind[i]+1;
while (p+1<q)
{
r=(p+q)/2;
if (nr[r]>m) q=r;
else if (nr[r]<m) p=r;
else {gas=1;break;}
}
if (gas) nrsol++;
}
}
printf("%d\n",nrsol);
return 0;
}