Cod sursa(job #1482115)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 6 septembrie 2015 15:15:35
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<cstdio>
#include<algorithm>
using namespace std;
char si[17000];
int pf[22][17000];
struct sp
{
    int pre,nex,pos;
} ve[17000];
bool cmp(sp a1,sp a2)
{
    if(a1.pre!=a2.pre)
        return a1.pre<a2.pre;
    return a1.nex<a2.nex;
}
int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    int n,k,i,j,lg,cn,la,a,b,x,p2;
    scanf("%d%d\n",&n,&k);
    gets(si+1);
    if(n==1)
    {
        if(k==1)
            printf("1\n");
        else
            printf("0\n");
        return 0;
    }
    for(i=1; i<=n; i++)
    {
        if(si[i]>='a' && si[i]<='z')
            si[i]=si[i]-'a'+1;
        else if(si[i]>='A' && si[i]<='Z')
        {
            si[i]=si[i]-'A'+30;
        }
        else
            si[i]=si[i]-'0'+60;
        pf[0][i]=si[i];
    }
    lg=1;
    for(cn=1; (cn>>1)<=n; lg++,(cn<<=1))
    {
        for(i=1; i<=n; i++)
        {
            ve[i].pre=pf[lg-1][i];
            ve[i].nex=pf[lg-1][i+cn];
            ve[i].pos=i;
        }
        sort(ve+1,ve+n+1,cmp);
        for(i=1; i<=n; i++)
        {
            if(i>1 && ve[i].pre==ve[i-1].pre && ve[i].nex==ve[i-1].nex)
                pf[lg][ve[i].pos]=pf[lg][ve[i-1].pos];
            else
                pf[lg][ve[i].pos]=i;
        }
    }
    lg--;
    la=0;
    for(i=n-k+1; i>=1; i--)
    {
        a=ve[i].pos;
        b=ve[i+k-1].pos;
        x=0;
        p2=(1<<lg);
        for(j=lg; j>=0; j--)
        {
            if(a+p2-1<=n && b+p2-1<=n)
            {
                if(pf[j][a]==pf[j][b])
                {
                    a=a+p2;
                    b=b+p2;
                    x=x+p2;
                }
            }
            p2=p2/2;
        }
        if(x>la)
            la=x;
    }
    printf("%d\n",la);
    return 0;
}