//#define TESTING #pragma GCC optimize ("-O3") #pragma optimize("t", on) #ifdef _WIN32 # define LL "%I64d" #else # define LL "%Ld" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define null NULL #define mp make_pair #define pb(a) push_back(a) #define sz(a) ((int)(a).size()) #define all(a) a.begin() , a.end() #define fi first #define se second #define relaxMin(a , b) (a) = min((a),(b)) #define relaxMax(a , b) (a) = max((a),(b)) #define SQR(a) ((a)*(a)) typedef vector vi; typedef pair pii; typedef long long ll; #define MAX_L 200010 #define MAX_WRD_L 110 #define MAX_WRD_C 55 int big_rand(){ return (rand()<<10) ^ rand(); } // Optimize typedef pair state; typedef pair< int , pair > cut_state; int main() __attribute__((optimize("-O3"))); void read() __attribute__((optimize("-O3"))); //void write() //__attribute__((optimize("-O2"))); int score() __attribute__((optimize("-O3"))); state one_center(int) __attribute__((optimize("-O3"))); state two_centers(int , int) __attribute__((optimize("-O3"))); state put_word(int) __attribute__((optimize("-O3"))); int configure() __attribute__((optimize("-O3"))); void generate(int) __attribute__((optimize("-O3"))); void best_move() __attribute__((optimize("-O3"))); state straight(int) __attribute__((optimize("-O3"))); state straight_move(int , int) __attribute__((optimize("-O3"))); void solve() __attribute__((optimize("-O3"))); int apply_cut(int , int , int) __attribute__((optimize("-O3"))); cut_state best_cut() __attribute__((optimize("-O3"))); cut_state best_with_profile(int , int) __attribute__((optimize("-O3"))); cut_state best_profile() __attribute__((optimize("-O3"))); // // Input FILE* rfile = /*stdin;*/ fopen("fixdna.in" , "r"); FILE* wfile = /*stdout;*/ fopen("fixdna.out" , "w"); int N , K , T; char SRC[MAX_L] , SNK[MAX_L]; int PR[32][32] , *PR_P[MAX_L]; int WRDC , WRDL[MAX_WRD_C]; char WRD[MAX_WRD_C][MAX_WRD_L]; void read(){ #ifndef TESTING fscanf(rfile , "%d%d%d" , &N , &K , &T); fscanf(rfile , "%s" , &SRC); fscanf(rfile , "%s" , &SNK); for(int i=0;i > out; vi add_info; void write(){ fprintf(wfile , "%d\n" , sz(out)); for(int i=0;i= lo_lim && ++hi < hi_lim){ dlt -= PR_P[lo][SRC[lo]], dlt -= PR_P[hi][SRC[hi]], dlt += PR_P[lo][SRC[hi]], dlt += PR_P[hi][SRC[lo]]; if(dlt < val) val = dlt, f = lo , t = hi; } return state(val , mp(f , t)); } state two_centers(int c1 , int c2){ int val = 0 , f = 0 , t = 0; if(c2 >= N) return state(val , mp(f , t)); int lo = c1 + 1 , hi = c2 - 1 , dlt = 0; int lo_lim = max(0 , c1 - BORDER); int hi_lim = min(N , c2 + BORDER); while(--lo >= lo_lim && ++hi < hi_lim){ dlt -= PR_P[lo][SRC[lo]], dlt -= PR_P[hi][SRC[hi]], dlt += PR_P[lo][SRC[hi]], dlt += PR_P[hi][SRC[lo]]; if(dlt < val) val = dlt, f = lo , t = hi; } return state(val , mp(f , t)); } state put_word(int c){ int val = 0 , f = 0 , cv; for(int i=0;i N) continue; char* w = WRD[i]; cv = 0 , cl += c; for(int j=c;j= N){ for(int i=0;i= how) break; } } } void best_move(){ bflip = bput = state(0 , mp(0,0)); int how = min(TRY_FLIPS , N); generate(how); for(int i=0;i= N) return state(0 , mp(0,0)); int bst = 0 , dlt = 0; int bf = 0 , bt = 0; for(int i=0;i=p;--i) BUF[i + len] = BUF[i]; for(int i=0;i= N) return mp(0 , mp(mp(0,0) , 0)); int bst = 0 , dlt = 0; int bf = 0 , bt = 0; for(int i=0;i<=r2;++i) dlt -= PR_P[l1 + i][SRC[l1 + i]]; for(int i=0;i= MID_LIMIT) BORDER = MID_BORDER; if(i >= LAST_LIMIT) BORDER = LAST_BORDER; best_move(); int SLO = STR_LIM_LO , SHI = STR_LIM_HI; if(i > B_STR) SLO = B_STR_LIM_LO , SHI = B_STR_LIM_HI; bchange = straight_move(SLO , SHI); cut_state bcut = best_profile(); if(bcut.fi < min(bchange.fi, min(bflip.fi , bput.fi))){ //cout< void solve(){ configure(); #ifdef TESTING double beg = clock(); #endif if(N <= 100 && T <= 20) small_solve(); else iterate(); #ifdef TESTING printf("%.3lf\n" , (clock() - beg)/CLOCKS_PER_SEC); #endif } int main(){ read(); #ifdef TESTING cout<