Cod sursa(job #172320)

Utilizator savimSerban Andrei Stan savim Data 6 aprilie 2008 09:50:23
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 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];
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;
}