Untitled

 avatar
unknown
plain_text
5 months ago
5.8 kB
3
Indexable
#include <iostream>
using namespace std;

int a[4], b[4], cnt[1000];
int temp;

void init(int mCnt1, int mDigitList1[30000], int mCnt2, int mDigitList2[30000]){
    for(int i=0; i<1000; i++) {
        cnt[i] = 0;
    }
    temp = 0;
    a[0] = mDigitList1[0];
    a[1] = mDigitList1[1];
    a[2] = mDigitList1[mCnt1 - 2];
    a[3] = mDigitList1[mCnt1 - 1];
    b[0] = mDigitList2[0];
    b[1] = mDigitList2[1];
    b[2] = mDigitList2[mCnt2 - 2];
    b[3] = mDigitList2[mCnt2 - 1];
    
    for(int i = 0; i < mCnt1 - 2; i++) {
        temp = mDigitList1[i] * 100 + mDigitList1[i+1] * 10 + mDigitList1[i+2];
        cnt[temp]++;
    }
    for(int i = 0; i < mCnt2 - 2; i++) {
        temp = mDigitList2[i] * 100 + mDigitList2[i+1] * 10 + mDigitList2[i+2];
        cnt[temp]++;
    }
    temp = a[2] * 100 + a[3] * 10 + b[0];
    cnt[temp]++;
    temp = a[3] * 100 + b[0] * 10 + b[1];
    cnt[temp]++;
}

void append(int mDir, int mNum1, int mNum2){
    // Xóa các cặp số cũ trước khi thêm mới
    temp = a[2] * 100 + a[3] * 10 + b[0];
    cnt[temp]--;
    temp = a[3] * 100 + b[0] * 10 + b[1];
    cnt[temp]--;
    
    if(mDir == 0) { //left
        if(mNum1 < 10) {
            temp = mNum1 * 100 + a[0] * 10 + a[1];
            cnt[temp]++;

            a[1] = a[0];
            a[0] = mNum1;
        }
        else if(mNum1 < 100 && mNum1 >= 10) {
            temp = (mNum1 / 10) * 100 + (mNum1 % 10) * 10 + a[0];
            cnt[temp]++;
            temp = (mNum1 % 10) * 100 + a[0] * 10 + a[1];
            cnt[temp]++;

            a[1] = mNum1 % 10;
            a[0] = mNum1 / 10;
        }
        else if(mNum1 < 1000 && mNum1 >= 100) {
            cnt[mNum1]++;
            temp = ((mNum1 / 10) % 10) * 100 + (mNum1 % 10) * 10 + a[0];
            cnt[temp]++;
            temp = (mNum1 % 10) * 100 + a[0] * 10 + a[1];
            cnt[temp]++;

            a[1] = (mNum1 / 10) % 10;
            a[0] = mNum1 / 100;
        }
        
        //Update Num2 (left)
        if(mNum2 < 10) {
            temp = a[2] * 100 + a[3] * 10 + mNum2;
            cnt[temp]++;
            temp = a[3] * 100 + mNum2 * 10 + b[0];
            cnt[temp]++;
            temp = mNum2 * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            b[1] = b[0];
            b[0] = mNum2;
        }
        else if(mNum2 >= 10 && mNum2 < 100) {
            int chuc = mNum2 / 10;
            int donvi = mNum2 % 10;

            temp = a[2] * 100 + a[3] * 10 + chuc;
            cnt[temp]++;
            temp = a[3] * 100 + chuc * 10 + donvi;
            cnt[temp]++;
            temp = chuc * 100 + donvi * 10 + b[0];
            cnt[temp]++;
            temp = donvi * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            b[0] = chuc;
            b[1] = donvi;
        }
        else if(mNum2 < 1000 && mNum2 >= 100) {
            int tram = mNum2 / 100;
            int chuc = (mNum2 / 10) % 10;
            int donvi = mNum2 % 10;

            temp = a[2] * 100 + a[3] * 10 + tram;
            cnt[temp]++;
            temp = a[3] * 100 + tram * 10 + chuc;
            cnt[temp]++;
            cnt[mNum2]++;
            temp = chuc * 100 + donvi * 10 + b[0];
            cnt[temp]++;
            temp = donvi * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            b[0] = tram;
            b[1] = chuc;
        }
    } 
    else if(mDir == 1) { // right
        if(mNum1 < 10) {
            temp = a[2] * 100 + a[3] * 10 + mNum1;
            cnt[temp]++;
            temp = a[3] * 100 + mNum1 * 10 + b[0];
            cnt[temp]++;
            temp = mNum1 * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            a[2] = a[3];
            a[3] = mNum1;
        }
        else if(mNum1 < 100 && mNum1 >= 10) {
            int chuc = mNum1 / 10;
            int donvi = mNum1 % 10;

            temp = a[2] * 100 + a[3] * 10 + chuc;
            cnt[temp]++;
            temp = a[3] * 100 + chuc * 10 + donvi;
            cnt[temp]++;
            temp = chuc * 100 + donvi * 10 + b[0];
            cnt[temp]++;
            temp = donvi * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            a[2] = chuc;
            a[3] = donvi;
        } 
        else if(mNum1 < 1000 && mNum1 >= 100) {
            int tram = mNum1 / 100;
            int chuc = (mNum1 / 10) % 10;
            int donvi = mNum1 % 10;

            temp = a[2] * 100 + a[3] * 10 + tram;
            cnt[temp]++;
            temp = a[3] * 100 + tram * 10 + chuc;
            cnt[temp]++;
            cnt[mNum1]++;
            temp = chuc * 100 + donvi * 10 + b[0];
            cnt[temp]++;
            temp = donvi * 100 + b[0] * 10 + b[1];
            cnt[temp]++;

            a[2] = chuc;
            a[3] = donvi;
        }

        //Update Num2 right
        if(mNum2 < 10) {
            temp = b[2] * 100 + b[3] * 10 + mNum2;
            cnt[temp]++;

            b[2] = b[3];
            b[3] = mNum2;
        }
        else if(mNum2 >= 10 && mNum2 < 100) {
            int chuc = mNum2 / 10;
            int donvi = mNum2 % 10;

            temp = b[2] * 100 + b[3] * 10 + chuc;
            cnt[temp]++;
            temp = b[3] * 100 + chuc * 10 + donvi;
            cnt[temp]++;

            b[2] = chuc;
            b[3] = donvi;
        }
        else if(mNum2 >= 100 && mNum2 < 1000) {
            int tram = mNum2 / 100;
            int chuc = (mNum2 / 10) % 10;
            int donvi = mNum2 % 10;
            
            temp = b[2] * 100 + b[3] * 10 + tram;  // Sửa lỗi dấu + thành *
            cnt[temp]++;
            temp = b[3] * 100 + tram * 10 + chuc;
            cnt[temp]++;
            cnt[mNum2]++;
            
            b[2] = chuc;
            b[3] = donvi;
        }
    }
}

int countNum(int mNum){
    return cnt[mNum];
}
Editor is loading...
Leave a Comment