Cod sursa(job #1521336)

Utilizator ASTELOTudor Enescu ASTELO Data 10 noiembrie 2015 11:00:26
Problema Substr Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define n1 100007
#define n2 100021
using namespace std;
char s[20001],c;
int cate,i;
struct eu{int x,y;};
eu v[20001];
bool sorting(eu a,eu b)
  {
  return a.x<b.x;
  }
int x=1,y=1,j,k,l,n,r1,r2,q,nr1,nr2,nrr1=0,nrr2=0,l1,l2,mid,o;
int main ()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d%c",&n,&k,&c);
l1=1;
l2=n-k+1;
gets(s);
while(l1<=l2)
    {
    int pp=0;
    mid=(l1+l2)/2;
    x=1;
    y=1;
    for(i=1;i<=mid;i++)
        {
        if(i!=1)
          {
          x=(x*123)%n1;
          y=(y*123)%n2;
          }
        }
    nrr1=0,nrr2=0;
    for(i=0;i<mid;i++)
        {
        q=s[i];
        nrr1=nrr1*123+q;
        nrr2=nrr2*123+q;
        nrr1%=n1;
        nrr2%=n2;
        }
    cate=0;
    v[++cate].x=nrr1;
    v[cate].y=nrr2;
    for(i=0;i<=n-mid-1;i++)
        {
        int x1,y1;
        x1=(x*s[i])%n1;
        y1=(y*s[i])%n2;
        nrr1-=x1;
        nrr2-=y1;
        if(nrr1<0)
          nrr1+=n1;
        if(nrr2<0)
          nrr2+=n2;
        q=s[i+mid];
        nrr1=(nrr1*123+q)%n1;
        nrr2=(nrr2*123+q)%n2;
        v[++cate].x=nrr1;
        v[cate].y=nrr2;
        }
    sort(v+1,v+cate+1,sorting);
    int l=1,lmax=0;
    for(i=2;i<=cate;i++)
      {
      if(v[i].x==v[i-1].x&&v[i].y==v[i-1].y)
        l++;
      else
        {
        if(l>lmax)
          lmax=l;
        l=1;
        }
      }
    if(l>lmax)
      lmax=l;
    if(lmax>=k)
      {
      o=mid;
      l1=mid+1;
      }
    else
        l2=mid-1;
    }
printf("%d",o);
return 0;
}