wojiaocbj

rotate

Mar 21st, 2022
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.07 KB | None | 0 0
  1. #include <stdio.h>
  2. #pragma warning(disable:4996)
  3. unsigned int a[500001] = { 0 };
  4. int main(){
  5.     int n, i = 0, d, d2, e, input;
  6.     unsigned int t, tmp;
  7.     char c[5] = { 0 };
  8.     int left, right;//2 pointers to move array
  9.     while(scanf("%d", &n) != EOF){
  10.         for(i = 0; i < n; i++){
  11.             scanf("%d", &input);
  12.             a[i] = (unsigned int)input;
  13.         }
  14.         scanf("%s%u", c, &t);
  15.         if(c[0] == 'l'){
  16.             if(t % (32 * n) != 0){
  17.                 d2 = t % (32 * n);
  18.                 e = (d2 / 32) % n;
  19.                 d = d2 % 32;
  20.                 if(e != 0){
  21.                     //too slow when big data encountered
  22.                     /*for(i = 0; i < e; i++){
  23.                         unsigned int x = a[0];
  24.                         for(int j = 0; j < n - 1; j++){
  25.                             a[j] = a[j + 1];
  26.                         }
  27.                         a[n - 1] = x;
  28.                     }*/
  29.                     left = 0; right = e - 1;
  30.                     while(left < right){
  31.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  32.                         left++; right--;
  33.                     }
  34.                     left = e; right = n - 1;
  35.                     while(left < right){
  36.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  37.                         left++; right--;
  38.                     }
  39.                     left = 0; right = n - 1;
  40.                     while(left < right){
  41.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  42.                         left++; right--;
  43.                     }
  44.                     if(d){//need to move bits
  45.                         unsigned int f = a[0];
  46.                         for(i = 0; i < n - 1; i++){
  47.                             a[i] = (a[i] << d) | (a[i + 1] >> (32 - d));
  48.                         }
  49.                         a[n - 1] = (a[n - 1] << d) | (f >> (32 - d));
  50.                     }
  51.                    
  52.                 }
  53.                 else{
  54.                     if(d){//need to move bits
  55.                         unsigned int f = a[0];
  56.                         for(i = 0; i < n - 1; i++){
  57.                             a[i] = (a[i] << d) | (a[i + 1] >> (32 - d));
  58.                         }
  59.                         a[n - 1] = (a[n - 1] << d) | (f >> (32 - d));
  60.                     }                  
  61.                 }
  62.                 for(i = 0; i < n; i++){
  63.                     printf("%d ", (int)a[i]);
  64.                 }
  65.             }
  66.             else{
  67.                 for(i = 0; i < n; i++){
  68.                     printf("%d ", (int)a[i]);
  69.                 }
  70.             }
  71.         }
  72.         if(c[0] == 'r'){
  73.             if(t % (32 * n) != 0){
  74.                 d2 = t % (32 * n);
  75.                 e = (d2 / 32) % n;
  76.                 d = d2 % 32;
  77.                 if(e != 0){
  78.  
  79.                     /*for(i = 0; i < e; i++){
  80.                         unsigned int x = a[n - 1];
  81.                         for(int j = n - 1; j > 0; j--){
  82.                             a[j] = a[j - 1];
  83.                         }
  84.                         a[0] = x;
  85.                     }*/
  86.                     left = 0; right = n - 1;
  87.                     while(left < right){
  88.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  89.                         left++; right--;
  90.                     }
  91.                     left = 0; right = e - 1;
  92.                     while(left < right){
  93.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  94.                         left++; right--;
  95.                     }
  96.                     left = e; right = n - 1;
  97.                     while(left < right){
  98.                         tmp = a[left]; a[left] = a[right]; a[right] = tmp;
  99.                         left++; right--;
  100.                     }
  101.                    
  102.                     if(d){
  103.                         unsigned int f = a[n - 1];
  104.                         for(i = n - 1; i > 0; i--){
  105.                             a[i] = (a[i] >> d) | (a[i - 1] << (32 - d));
  106.                         }
  107.                         a[0] = (a[0] >> d) | (f << (32 - d));
  108.                     }              
  109.                     for(i = 0; i < n; i++){
  110.                         printf("%d ", (int)a[i]);
  111.                     }
  112.                 }
  113.                 else{
  114.                     if(d){
  115.                         unsigned int f = a[n - 1];
  116.                         for(i = n - 1; i > 0; i--){
  117.                             a[i] = (a[i] >> d) | (a[i - 1] << (32 - d));
  118.                         }
  119.                         a[0] = (a[0] >> d) | (f << (32 - d));
  120.                     }
  121.                     for(i = 0; i < n; i++){
  122.                         printf("%d ", (int)a[i]);
  123.                     }
  124.                 }
  125.             }
  126.         }
  127.         printf("\n");
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment