Cod sursa(job #2385514)

Utilizator cristibogdanPatrascu Cristian cristibogdan Data 21 martie 2019 22:40:16
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");


struct du2{
    pair <int,int> p;
    int poz;}v[20000];


bool cmp2(du2 a, du2 b){
    if(a.p.first<b.p.first)
        return true;
    if(a.p.first==b.p.first)
        if(a.p.second < b.p.second)
            return true;
    return false;
    }
int n,m,i,d[20000][100],len,k,sol,logN,ss[20000],viz[300],nr;
char s[20000];


int cmlp(int x,int y){
    int sol = 0;
    if(x==y)
        return n;
     for(int k = logN; k>=0; k--){

        if(d[x][k]==d[y][k]){
            x+=(1<<k);
            y+=(1<<k);
            if(x>n||y>n)
                break;
            sol+=(1<<k);

        }
    }
    return sol;

}
int main()
{
    f>>n>>m>>s;
    int len = strlen(s);

   for(i=0;i<len;i++)
        d[i][0]=s[i]-'0';

    for(k=1;(1<<(k-1))<=n;k++){
        for(i=0;i<len;i++){
            int j = i+(1<<(k-1));
            if(j>=len)
                v[i].p=make_pair(d[i][k-1],-1);
            else
                v[i].p=make_pair(d[i][k-1],d[j][k-1]);
            v[i].poz=i;
        }
        sort(v,v+len,cmp2);
        nr = 0;
        d[v[0].poz][k] = 0;
        for(i=1;i<len;i++){
            if((v[i-1].p.first != v[i].p.first) || (v[i-1].p.second != v[i].p.second))
                nr++;
            d[v[i].poz][k] = nr;
        }
    }

    logN = k-1;

    for(i=0;i<len;i++)
        ss[d[i][logN]]=i;

    for(i=0;i+m-1<len;i++){
        int x = ss[i];
        int y = ss[i+m-1];
        sol = max(sol,cmlp(x,y));
    }
    g<<sol;

    return 0;
}