Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #pragma warning(disable:4996)
- unsigned int a[500001] = { 0 };
- int main(){
- int n, i = 0, d, d2, e, input;
- unsigned int t, tmp;
- char c[5] = { 0 };
- int left, right;//2 pointers to move array
- while(scanf("%d", &n) != EOF){
- for(i = 0; i < n; i++){
- scanf("%d", &input);
- a[i] = (unsigned int)input;
- }
- scanf("%s%u", c, &t);
- if(c[0] == 'l'){
- if(t % (32 * n) != 0){
- d2 = t % (32 * n);
- e = (d2 / 32) % n;
- d = d2 % 32;
- if(e != 0){
- //too slow when big data encountered
- /*for(i = 0; i < e; i++){
- unsigned int x = a[0];
- for(int j = 0; j < n - 1; j++){
- a[j] = a[j + 1];
- }
- a[n - 1] = x;
- }*/
- left = 0; right = e - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- left = e; right = n - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- left = 0; right = n - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- if(d){//need to move bits
- unsigned int f = a[0];
- for(i = 0; i < n - 1; i++){
- a[i] = (a[i] << d) | (a[i + 1] >> (32 - d));
- }
- a[n - 1] = (a[n - 1] << d) | (f >> (32 - d));
- }
- }
- else{
- if(d){//need to move bits
- unsigned int f = a[0];
- for(i = 0; i < n - 1; i++){
- a[i] = (a[i] << d) | (a[i + 1] >> (32 - d));
- }
- a[n - 1] = (a[n - 1] << d) | (f >> (32 - d));
- }
- }
- for(i = 0; i < n; i++){
- printf("%d ", (int)a[i]);
- }
- }
- else{
- for(i = 0; i < n; i++){
- printf("%d ", (int)a[i]);
- }
- }
- }
- if(c[0] == 'r'){
- if(t % (32 * n) != 0){
- d2 = t % (32 * n);
- e = (d2 / 32) % n;
- d = d2 % 32;
- if(e != 0){
- /*for(i = 0; i < e; i++){
- unsigned int x = a[n - 1];
- for(int j = n - 1; j > 0; j--){
- a[j] = a[j - 1];
- }
- a[0] = x;
- }*/
- left = 0; right = n - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- left = 0; right = e - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- left = e; right = n - 1;
- while(left < right){
- tmp = a[left]; a[left] = a[right]; a[right] = tmp;
- left++; right--;
- }
- if(d){
- unsigned int f = a[n - 1];
- for(i = n - 1; i > 0; i--){
- a[i] = (a[i] >> d) | (a[i - 1] << (32 - d));
- }
- a[0] = (a[0] >> d) | (f << (32 - d));
- }
- for(i = 0; i < n; i++){
- printf("%d ", (int)a[i]);
- }
- }
- else{
- if(d){
- unsigned int f = a[n - 1];
- for(i = n - 1; i > 0; i--){
- a[i] = (a[i] >> d) | (a[i - 1] << (32 - d));
- }
- a[0] = (a[0] >> d) | (f << (32 - d));
- }
- for(i = 0; i < n; i++){
- printf("%d ", (int)a[i]);
- }
- }
- }
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment