Untitled

 avatar
unknown
plain_text
5 months ago
4.6 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-1; i++) {
		temp = mDigitList1[i] * 100 + mDigitList1[i+1] * 10 + mDigitList1[i+2];
		cnt[temp]++;
	}
	for(int i=0; i<mCnt2 - 1; 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){
	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 + a[0];
			cnt[temp]++;
			int donvi = mNum1 % 10;
			temp = donvi * 100 + a[0] * 10 + a[1];
			cnt[temp]++;

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

			a[0] = mNum1 / 100;
			a[1] = chuc;
		}
		//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]++;

			a[2] = a[3];
			a[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[3] = donvi;
			b[2] = chuc;

		}
		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;
			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