Alx09

Ex8

Apr 25th, 2020
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. typedef enum { false, true }bool;
  5.  
  6. void swap(char *a, char* b)
  7. {
  8. if (*a == *b)
  9. return;
  10. *a ^= *b;
  11. *b ^= *a;
  12. *a ^= *b;
  13. }
  14. void rev(char *s, int l, int r)
  15. {
  16. while (l < r)
  17. swap(&s[l++], &s[r--]);
  18. }
  19.  
  20. int bSearch(char *s, int l, int r, int key)
  21. {
  22. int index = -1;
  23. while (l <= r) {
  24. int mid = l + (r - l) / 2;
  25. if (s[mid] <= key)
  26. r = mid - 1;
  27. else {
  28. l = mid + 1;
  29. if (index == -1 || s[index] >= s[mid])
  30. index = mid;
  31. }
  32. }
  33. return index;
  34. }
  35.  
  36. bool nextpermutation(char *s)
  37. {
  38. int len = strlen(s), i = len - 2;
  39. while (i >= 0 && s[i] >= s[i + 1])
  40. --i;
  41. if (i < 0)
  42. return false;
  43. else {
  44. int index = bSearch(s, i + 1, len - 1, s[i]);
  45. swap(&s[i], &s[index]);
  46. rev(s, i + 1, len - 1);
  47. return true;
  48. }
  49. }
  50.  
  51. int main() {
  52. char sir[1000];
  53. int i,n;
  54. FILE *f, *g;
  55. f = fopen("in.txt", "r");
  56. g = fopen("out.txt", "w");
  57. fscanf(f, "%d", &n);
  58. for (i = 1; i <= n; i++) {
  59. fscanf(f, "%s", sir);
  60. if (nextpermutation(sir))
  61. fprintf(g, "%s\n", sir);
  62. else
  63. fprintf(g, "-1\n");
  64. }
  65.  
  66. fclose(g);
  67. fclose(f);
  68. return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment