Cod sursa(job #2171694)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 15 martie 2018 13:13:19
Problema Substr Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include<vector>
#include<fstream>
using namespace std;
#define N 16400
#define M 1999
#define pb push_back
#define f first
#define s second
#define mp make_pair
int ans,i,it,n,k,v[255],P[N];
string S;
vector<pair<int,int> >a[M];
vector<int>e;
inline int Key(int x)
{
    if(x<2000)return x;
    return x%M;
}
inline bool egal(int x,int y,int dim)
{
    for(int t=0;t<dim;++t)
        if(S[x+t]!=S[y+t])return 0;
    return 1;
}
bool check(int m)
{
    int x=0,j,mx=1;
    while(!e.empty())
    {
        x=e[e.size()-1];
        e.pop_back();
        a[x].clear();
    }
    bool ok;
    for(it=0;it<m;++it)
        x=Key(x+v[S[it]]*P[it]);
    a[x].pb(mp(0,1));e.pb(x);
    for(it=m;it<n;++it)
    {
        x/=62;
        x=Key(1999+x+Key(v[S[it]]*P[m-1]) );
        ok=false;
        for(j=0;!ok&&j<a[x].size();++j)
            if(egal(it-m+1,a[x][j].f,m))
        {
            ++a[x][j].s;
            ok=true;
            mx=max(mx,a[x][j].s);
            if(mx>=k)return 1;
        }
        if(!ok)
        {
            if(!a[x].size())e.pb(x);
            a[x].pb(mp(it-m+1,1));
        }
    }
    return 0;
}
int main()
{
    i=(int)'a';
    for(it=0;it<26;++it)v[it+i]=it;
    i=(int)'A';
    for(it=0;it<26;++it)v[it+i]=26+it;
    i=(int)'0';
    for(it=0;it<10;++it)v[it+i]=52+it;
    ifstream fin("substr.in");
    ofstream fout("substr.out");
    fin.sync_with_stdio(false);
    fout.sync_with_stdio(false);
    fin>>n>>k;
    fin>>S;
    if(k==1)
    {
        fout<<n;
        return 0;
    }
    P[0]=1;
    for(i=1;i<n;++i)P[i]=Key(P[i-1]*62);
    ans=0;
    for(i=n;i;i>>=1)
    {
        while(i+ans<=n && check(i+ans))
            ans+=i;
    }
    fout<<ans;
    return 0;
}