Pagini recente » Cod sursa (job #191657) | Cod sursa (job #1600631) | Cod sursa (job #893608) | Cod sursa (job #1024846) | Cod sursa (job #172469)
Cod sursa(job #172469)
#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],nr2[maxl],k,t;
int ind[25];
int n,m,i,j,x,p,q,r,gas,nrsol,baz,baz2;
int main()
{
freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);
baz=4;baz2=29;
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;t=1;
for (j=x-1; j>=0; j--)
{
nr[ind[x]]+=k*(a[i][j]-96);
nr2[ind[x]]+=t*(a[i][j]-96);
k=k*baz;
t=t*baz2;
}
}
for (i=1; i<=20; i++)
if (ind[i]>ind[i-1])
{
sort(nr+ind[i-1]+1,nr+ind[i]+1);
sort(nr2+ind[i-1]+1,nr2+ind[i]+1);
}
x=strlen(text);
for (i=1; i<=20; i++)
if (ind[i]!=ind[i-1])
{
k=1;m=0;n=0;t=1;
for (j=i-1; j>=0; j--)
{
m=m+k*(text[j]-96);
n=n+t*(text[j]-96);
if (j!=0) k*=baz;
if (j!=0) t*=baz2;
}
p=ind[i-1];q=ind[i]+1;
while (p+1<q)
{
r=(p+q)>>1;
if (nr[r]>m) q=r;
else if (nr[r]<m) p=r;
else {gas=1;break;}
}
if (gas && nr[r]==m && nr2[r]==n) nrsol++;
for (j=i; j<=x-1; j++)
{
gas=0;
m=m-(text[j-i]-96)*k;
m=m*baz+text[j]-96;
n=n-(text[j-i]-96)*t;
n=n*baz2+text[j]-96;
p=ind[i-1];q=ind[i]+1;
while (p+1<q)
{
r=(p+q)>>1;
if (nr[r]>m) q=r;
else if (nr[r]<m) p=r;
else {gas=1;break;}
}
if (gas && nr[r]==m && nr2[r]==n) nrsol++;
}
}
printf("%d\n",nrsol);
return 0;
}