Cod sursa(job #1075363)

Utilizator stefanzzzStefan Popa stefanzzz Data 8 ianuarie 2014 21:39:39
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <algorithm>
#define MAXN 17000
#define MAXLOGN 15
#define BASE 100000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");

int n,m,poz[2*MAXN],ord[MAXN],cnt,sol;
long long v[MAXN];
char s[MAXN];
bool ok;

bool Comp(int a,int b){
    return v[a]<v[b];}

int main()
{
    int i,j;
    f>>n>>m;
    if(m==1){
        g<<n<<'\n';
        return 0;}
    f.getline(s,MAXN,'\n');
    f.getline(s+1,MAXN,'\n');
    for(i=1;i<=n;i++){
        ord[i]=i;
        v[i]=s[i]-'0'+1;}
    sort(ord+1,ord+n+1,Comp);
    cnt=ok=0;
    for(i=1;i<=n;i++){
        if(v[ord[i]]==v[ord[i-1]]){
            cnt++;
            poz[ord[i]]=poz[ord[i-1]];}
        else{
            if(cnt>=m-1)
                ok=1;
            cnt=0;
            poz[ord[i]]=i;}}
    if(!ok&&cnt<m-1){
        g<<"0\n";
        return 0;}
    for(i=1;i<MAXLOGN;i++){
        for(j=1;j<=n;j++)
            v[j]=1LL*poz[j]*BASE+poz[j+(1<<(i-1))];
        sort(ord+1,ord+n+1,Comp);
        cnt=ok=0;
        for(j=1;j<=n;j++){
            if(v[ord[j]]==v[ord[j-1]])
                cnt++;
            else{
                if(cnt>=m-1)
                    ok=1;
                cnt=0;}}
        if(!ok&&cnt<m-1)
            break;
        for(j=1;j<=n;j++){
            if(v[ord[j]]==v[ord[j-1]])
                poz[ord[j]]=poz[ord[j-1]];
            else
                poz[ord[j]]=j;}}
    i--;
    sol+=(1<<i);
    for(i=i-1;i>=0;i--){
        for(j=1;j<=n;j++)
            v[j]=1LL*poz[j]*BASE+poz[j+(1<<i)];
        sort(ord+1,ord+n+1,Comp);
        ok=cnt=0;
        for(j=1;j<=n;j++){
            if(v[ord[j]]==v[ord[j-1]])
                cnt++;
            else{
                if(cnt>=m-1){
                    ok=1;
                    break;}
                cnt=0;}}
        if(!ok&&cnt<m-1)
            continue;
        sol+=(1<<i);
        for(j=1;j<=n;j++){
            if(v[ord[j]]==v[ord[j-1]])
                poz[ord[j]]=poz[ord[j-1]];
            else
                poz[ord[j]]=j;}}
    g<<sol<<'\n';
    f.close();
    g.close();
    return 0;
}