#include #include #include #include #include #include #include #define cin in_file #define cout out_file using namespace std; using namespace chrono; const double INITIAL_T=25; const int GEN_SIZE=75; const int KILLED_PER_GEN=50; double PROBABILITY_CHANGE=0.96; const int CROSS_RATE=4; const int MUTATION_TRIES=20; const int GOOD_MUATIONS=100; ifstream in_file("keyboard.in"); ofstream out_file("keyboard.out"); struct point { int x,y; }; struct mut { int a,b; }; struct mut_by_c { int n; int m[8]; }; point pos[32]; int seq[32]; //int cns[32]; mut muts[256]; mut_by_c muts_by_c[32]; int num_muts=0; int len; string s; int i; void init() { pos[1]={85, 140}; pos[2]={123, 140}; pos[3]={161, 140}; pos[4]={199, 140}; pos[5]={237, 140}; pos[6]={275, 140}; pos[7]={313, 140}; pos[8]={351, 140}; pos[9]={389, 140}; pos[10]={427, 140}; pos[11]={95, 179}; pos[12]={133, 179}; pos[13]={171, 179}; pos[14]={209, 179}; pos[15]={247, 179}; pos[16]={285, 179}; pos[17]={324, 179}; pos[18]={362, 179}; pos[19]={400, 179}; pos[20]={122, 219}; pos[21]={160, 219}; pos[22]={198, 219}; pos[23]={236, 219}; pos[24]={275, 219}; pos[25]={313, 219}; pos[26]={351, 219}; seq[0]=1; seq[1]=11; seq[2]=20; seq[3]=12; seq[4]=2; seq[5]=3; seq[6]=13; seq[7]=21; seq[8]=22; seq[9]=14; seq[10]=4; seq[11]=5; seq[12]=15; seq[13]=23; seq[14]=24; seq[15]=16; seq[16]=6; seq[17]=7; seq[18]=17; seq[19]=25; seq[20]=26; seq[21]=18; seq[22]=8; seq[23]=9; seq[24]=19; seq[25]=10; muts[num_muts++]={1, 2}; muts[num_muts++]={1, 11}; muts[num_muts++]={2, 3}; muts[num_muts++]={2, 12}; muts[num_muts++]={2, 11}; muts[num_muts++]={3, 4}; muts[num_muts++]={3, 13}; muts[num_muts++]={3, 12}; muts[num_muts++]={4, 5}; muts[num_muts++]={4, 14}; muts[num_muts++]={4, 13}; muts[num_muts++]={5, 6}; muts[num_muts++]={5, 15}; muts[num_muts++]={5, 14}; muts[num_muts++]={6, 7}; muts[num_muts++]={6, 16}; muts[num_muts++]={6, 15}; muts[num_muts++]={7, 8}; muts[num_muts++]={7, 17}; muts[num_muts++]={7, 16}; muts[num_muts++]={8, 9}; muts[num_muts++]={8, 18}; muts[num_muts++]={8, 17}; muts[num_muts++]={9, 10}; muts[num_muts++]={9, 19}; muts[num_muts++]={9, 18}; muts[num_muts++]={10, 19}; muts[num_muts++]={11, 12}; muts[num_muts++]={11, 20}; muts[num_muts++]={12, 13}; muts[num_muts++]={12, 21}; muts[num_muts++]={12, 20}; muts[num_muts++]={13, 14}; muts[num_muts++]={13, 22}; muts[num_muts++]={13, 21}; muts[num_muts++]={14, 15}; muts[num_muts++]={14, 23}; muts[num_muts++]={14, 22}; muts[num_muts++]={15, 16}; muts[num_muts++]={15, 24}; muts[num_muts++]={15, 23}; muts[num_muts++]={16, 17}; muts[num_muts++]={16, 25}; muts[num_muts++]={16, 24}; muts[num_muts++]={17, 18}; muts[num_muts++]={17, 26}; muts[num_muts++]={17, 25}; muts[num_muts++]={18, 19}; muts[num_muts++]={18, 26}; muts[num_muts++]={20, 21}; muts[num_muts++]={21, 22}; muts[num_muts++]={22, 23}; muts[num_muts++]={23, 24}; muts[num_muts++]={24, 25}; muts[num_muts++]={25, 26}; int a,b; for (int i=0;i=r.x) { score+=round(sqrt((r.x-p.x)*(r.x-p.x)+(r.y-p.y)*(r.y-p.y))); r=p; } else { int ld,rd; ld=(l.x-p.x)*(l.x-p.x)+(l.y-p.y)*(l.y-p.y); rd=(r.x-p.x)*(r.x-p.x)+(r.y-p.y)*(r.y-p.y); if (rd=r) { *this=sn; return 1; } return 0; } void init() { score=0; l=pos[fin]; fin2=cton[s[0]-'a']; r=pos[fin2]; if (l.x>r.x) swap(l,r); while (l.x==r.x) { fin=mutC(fin); l=pos[fin]; if (l.x>r.x) swap(l,r); } } void randomize() { for (int i=0;i<26;++i) { /*cton[i]=cns[i]; ntoc[cns[i]]=i;*/ ntoc[i+1]=i; } for (int i=26;i>1;--i) { swap(ntoc[i],ntoc[rand()%i+1]); cton[ntoc[i]]=i; } fin=rand()%26+1; } void combine(const sol &p1, const sol &p2) { //cerr<fin; //cerr<ntoc[seq[j[f]]]]!=0) j[f]++; if (j[f]<26) { ntoc[seq[i]]=p[f]->ntoc[seq[j[f]]]; cton[ntoc[seq[i]]]=seq[i]; } } //cerr<>len; cin>>s; } sol sols[GEN_SIZE],sols2[GEN_SIZE],winner; void output() { int &fin=winner.fin,&fin2=winner.fin2; if (pos[fin].x>pos[fin2].x) swap(fin,fin2); while (pos[fin].x==pos[fin2].x) { cerr<<"FIN ERROR"<pos[fin2].x) swap(fin,fin2); } for (int i=1;i<=26;++i) { cout<0) { sum+=index_tree[p-1]; p-=p&-p; } return sum; } double getOnly(int p) { return get(p)-get(p-1); } void add(int p, double a) { ++p; while (p<=GEN_SIZE) { index_tree[p-1]+=a; p+=p&-p; } } void null() { for (int i=0;ivalue) r=m-1; else { last=m; l=m+1; } } return last; } high_resolution_clock::time_point start,curr,start2; void solve() { double T=INITIAL_T; double reserve=0; double prob; int kill; int j,k,k2; int cc; bool fail=1; for (int i=0;i>(curr-start).count()<2.85-reserve) { start2=high_resolution_clock::now(); prob=1000; null(); for (int i=0;i>(curr-start2).count(); T-=T*reserve/(3-duration_cast>(curr-start).count()); //getch(); } cerr<