Advertisement
mamamaria

help

Feb 13th, 2021 (edited)
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.82 KB | None | 0 0
  1. #include <iostream>
  2. //4-батовое поле посчитать количество 1
  3. #include <ctime>
  4. using namespace std;
  5. //На вход программы случайная строка, состоящая из n бит.Написать программу, вычисляющую оценку вероятности того,
  6. //что в этой строке есть точно две одинаковых непересекающихся подстроки длины m;
  7.  
  8. const int n = 15; const int m = 4;
  9.  
  10. void genStr(int mas[], int l) {
  11.     for (int i = 0; i < l; i++)
  12.         mas[i] = rand() % 2;
  13. }
  14. void output(int str[], int l) {
  15.     for (int i = 0; i < l; i++) {
  16.         cout << str[i];
  17.     }
  18. }
  19.  
  20. int main()
  21. {
  22.  
  23.     srand(time(NULL));
  24.     int str[n]; int subs[m];
  25.     int check; int counter = 0, gcounter = 0; int GK = 0; int N = 1000000; int NminusM = n - m;
  26.     int k = 0; int i = 0; int j = 0; int s = 0; int t = 0;
  27.     __asm {
  28.         lea esi, str //вбрасываем массив str
  29.         lea edi, subs // subs
  30.  
  31.         FOR_K :  //внутренности for (int k = 0; k < N; k++) {
  32.         mov i,0
  33.         mov j,0
  34.         mov t,0
  35.         mov s,0
  36.        
  37.  
  38.             FOR_S: //for (int s = 0; s < n; s++) - генерация элементов массива str
  39.  
  40.        
  41.            
  42.             call rand//call rand;
  43.             mov ecx, s //индекс кладется в ecx
  44.             and eax, 1//%2
  45.  
  46.             mov edx, ecx //ecx пишем в edx
  47.             mov ebx, ecx //ecx пишем в ebx
  48.             and ebx, 31 //ebx делится на 32, и остаток кладется в ebx (номер бита в инте)
  49.             sar edx, 5 //в EDX кладется результат деления (номер инта)
  50.  
  51.             cmp eax, 1 //в зависимости от рандомно сгенерированного в eax бита,  делаем или bts, или btr
  52.             jne skip1S
  53.             bts[esi + edx * 4], ebx
  54.             jmp skip2S
  55.             skip1S :
  56.             btr[esi + edx * 4], ebx
  57.             skip2S :
  58.  
  59.             inc s //s++
  60.             mov ecx, s //для cmp сохраняем s в ecx
  61.             cmp ecx, n // сравниваем с n
  62.             jne FOR_S // если не равно n, повторяет все внутри FOR_S:
  63.  
  64.             FOR_T : //for (int t = 0; t < m; t++) - генерация элементов массива sub
  65.            
  66.             call rand//call rand;
  67.             mov ecx, s //индекс кладется в ecx
  68.             and eax, 1//%2
  69.  
  70.             mov edx, ecx
  71.             mov ebx, ecx
  72.             and ebx, 31
  73.             sar edx, 5
  74.             cmp eax, 1
  75.  
  76.             jne skip1T
  77.             bts[edi + edx * 4], ebx
  78.             jmp skip2T
  79.             skip1T :
  80.             btr[edi + edx * 4], ebx
  81.             skip2T :
  82.  
  83.             inc t //t++
  84.             mov ecx, t //для cmp сохраняем t в ecx
  85.             cmp ecx, m // сравниваем с m
  86.             jne FOR_T // если не равно m, повторяет все внутри FOR_T:
  87.  
  88.            
  89.             FOR_I: //for (int i = 0; i < n - m; ) {
  90.             mov j, 0 //зануляем j
  91.  
  92.                 FOR_J: // for (int j = 0; j < m; j++) {
  93.                 //if (subStr[j] == str[j + i])
  94.                 mov eax,j
  95.                 mov ebx,j
  96.                 and eax, 31
  97.                 sar ebx, 5
  98.                 bt[edi + ebx * 4], eax //subStr[j]
  99.                 setc ch
  100.  
  101.                 mov eax, j //[j + i]
  102.                 add eax, i
  103.                 mov ebx, eax
  104.  
  105.                 and eax, 31
  106.                 sar ebx, 5
  107.                 bt[esi + ebx * 4], eax //str[j + i]
  108.                 setc cl
  109.  
  110.                 cmp ch, cl
  111.                 jne ELSE_SUB_STR
  112.  
  113.                 mov check,1 //check = true;
  114.                 inc counter //  counter++;
  115.                
  116.                 ELSE_SUB_STR: //  else check = false;
  117.                 mov check, 0
  118.  
  119.                 //if (check == false || counter == m)
  120.                 cmp check, 0 //check == false?
  121.                 je IF_COUNTER_M
  122.                 mov ecx, counter
  123.                 cmp ecx, m //counter == m?
  124.                 jne END_IF_CHECK_COUNTER
  125.                    
  126.                     IF_COUNTER_M:
  127.                     //if (counter == m) {
  128.                     mov ecx, counter
  129.                     cmp ecx, m //counter == m?
  130.                     jne END_IF_COUNTER_M
  131.                     inc gcounter //gcounter++;
  132.                     mov ecx, i //i += m;
  133.                     add ecx,m
  134.                     mov i, ecx
  135.  
  136.                     END_IF_COUNTER_M:
  137.                     mov counter, 0 //counter = 0;
  138.                     jmp BREAK_HERE
  139.  
  140.                 END_IF_CHECK_COUNTER:
  141.  
  142.                 inc j //i++
  143.                 mov ecx, j //для cmp сохраняем i в ecx
  144.                 cmp ecx, m // сравниваем с n-m
  145.                 jne FOR_J //если не равно n-m, повторяет все внутри FOR_I:
  146.  
  147.             BREAK_HERE://СЮДА, НАВЕРНОЕ, ПРЫГНЕТ BREAK
  148.             inc i
  149.             mov ecx, i //для cmp сохраняем i в ecx
  150.             cmp ecx, NminusM // сравниваем с n-m
  151.             jne FOR_I //если не равно n-m, повторяет все внутри FOR_I:
  152.        
  153.  
  154.           cmp gcounter,2 // if (gcounter == 2)
  155.           jne NEXT
  156.           inc GK // GK += 1;
  157.           NEXT:
  158.           mov counter,0 //counter = 0;
  159.           mov gcounter,0 //gcounter = 0;
  160.  
  161.         inc k //k++
  162.         mov ecx, k //для cmp сохраняем k в ecx
  163.         cmp ecx, N // сравниваем с N
  164.         jne FOR_K //если не равно N, повторяет все внутри FOR_K:
  165.     }
  166.  
  167.     cout << GK;
  168.  
  169. }
  170.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement