Cod sursa(job #999986)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 21 septembrie 2013 19:39:09
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("password.in");
ofstream g("password.out");

#define LE 100666
#include <algorithm>
#include <cstring>

int i,j,a[LE],D[16][LE],ind[LE];
string sir;
int lgmax,n;
int tps,min_pos,result;

bool comp1(int i1,int i2)
{
    return  a[i1]<a[i2];
}

bool _eql(int i1 ,int i2)
{
    if (D[i-1][i1]==D[i-1][i2]&&D[i-1][i1+(1<<(i-1))]==D[i-1][i2+(1<<(i-1))])
        return true;

    return false;
}

bool comp2(int i1,int i2)
{
    if (D[i-1][i1]==D[i-1][i2])
        return D[i-1][i1+(1<<(i-1))]<D[i-1][i2+(1<<(i-1))];

    return D[i-1][i1]<D[i-1][i2];
}

int main()
{

    f>>sir;

    n=sir.length();
    for(i=0; i<n; ++i) a[i+1]=sir[i]-'a'+1;

for(i=n+1;i<=n+n;++i)a[i]=a[i-n];
n<<=1;

    for(lgmax=0; (1<<lgmax)<n; ++lgmax);

    for(i=1; i<=n; ++i) ind[i]=i;
    for(i=n;i<=(1<<lgmax);++i) a[i]=666;



    sort(ind+1,ind+n+1,comp1);

    for(i=1,tps=0; i<=n; ++i)
        if (a[ind[i]]==a[ind[i-1]]&&i>1) D[0][ind[i]]=tps;
        else D[0][ind[i]]=++tps;


    for(i=1; i<=lgmax; ++i)
    {
        for(j=1; j<=n; ++j) ind[j]=j;
        sort(ind+1,ind+n+1,comp2);


        for(j=1,tps=0; j<=n; ++j)
            if (j>1&&_eql(ind[j],ind[j-1])==true)
                D[i][ind[j]]=tps;
            else D[i][ind[j]]=++tps;
    }

 min_pos=(1<<30);

 //for(i=1;i<=n;++i) cout<<a[i]<<" ";
 //cout<<'\n'<<'\n';

    for(i=1; i+i<=n; ++i)
        if (D[lgmax][i]< min_pos)
        {
            min_pos=D[lgmax][i];
            result=i;
        }


//for(i=0;i<=lgmax;++i,cout<<'\n')
  //for(j=1;j<=n;++j) cout<<D[i][j]<<" ";
    g<<result-1<<'\n';

    f.close();
    g.close();
    return 0;
}