Pagini recente » Cod sursa (job #1949311) | Cod sursa (job #1821105) | Cod sursa (job #2243001) | Cod sursa (job #1238393) | Cod sursa (job #999986)
Cod sursa(job #999986)
#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;
}