Cod sursa(job #2385467)

Utilizator cristibogdanPatrascu Cristian cristibogdan Data 21 martie 2019 21:59:01
Problema Substr Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
struct du {
    char c;
    int poz;}sorted_s[20000];

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

int cmp(const du &a, const du &b){
    return a.c<b.c;}

int cmp2(du2 a, du2 b){
    if(a.p.first<b.p.first)
        return 1;
    if(a.p.first==b.p.first)
        if(a.p.second < b.p.second)
            return 1;
    return 0;
    }
int n,m,i,d[20000][100],len,k,sol,logN,ss[20000];
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++)
    {
        sorted_s[i].c = s[i];
        sorted_s[i].poz = i;
    }
    sort(sorted_s,sorted_s+len,cmp);
    int nr = 0;
    d[sorted_s[0].poz][0] = 0;
    for(i=1;i<len;i++){
        if(sorted_s[i-1].c != sorted_s[i].c)
            nr++;
        d[sorted_s[i].poz][0] = nr;
    }

    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;
}