Cod sursa(job #172469)

Utilizator savimSerban Andrei Stan savim Data 6 aprilie 2008 15:21:52
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#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;
}