fork download
  1. /* Problem Statement: https://w...content-available-to-author-only...j.com/problems/PALIN/
  2.   Author: striker
  3. */
  4.  
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<inttypes.h>
  8. #include<string.h>
  9. #include<stdbool.h>
  10. #include<assert.h>
  11.  
  12. #define STRING_LENGTH 1000002
  13.  
  14. bool check_palindrome(char[]);
  15. bool check_all_nines(char[]);
  16. void find_next_palindrome(char[]);
  17.  
  18. int main(void) {
  19. uint64_t test;
  20. scanf("%"SCNu64,&test);
  21. assert(test > 0);
  22. while(test--) {
  23. char number_base_10[STRING_LENGTH];
  24. scanf("%s",number_base_10);
  25. uint32_t string_len = strlen(number_base_10);
  26. assert(string_len > 0);
  27. if(check_all_nines(number_base_10)) {
  28. for(uint32_t i=0;i<=string_len;++i) {
  29. if(i == 0 || i == (string_len)) {
  30. number_base_10[i] = '1';
  31. } else {
  32. number_base_10[i] = '0';
  33. }
  34. }
  35. } else {
  36. find_next_palindrome(number_base_10);
  37. }
  38. puts(number_base_10);
  39. memset(number_base_10,'\0',sizeof(char)*STRING_LENGTH);
  40. }
  41. return 0;
  42. }
  43.  
  44. bool check_all_nines(char number[]) {
  45. bool is_all_nines = true;
  46. for(uint32_t i=0;number[i]!='\0';++i) {
  47. if(!(number[i] == '9')) {
  48. is_all_nines = false;
  49. break;
  50. }
  51. }
  52. return is_all_nines;
  53. }
  54.  
  55. bool check_palindrome(char number[]) {
  56. bool is_palindrome = true;
  57. for(uint32_t start = 0,end = (strlen(number) - 1);(start < end);++start,--end) {
  58. if(!(number[start] == number[end])) {
  59. is_palindrome = false;
  60. break;
  61. }
  62. }
  63. return is_palindrome;
  64. }
  65.  
  66. void find_next_palindrome(char number[]) {
  67. uint32_t str_len = strlen(number);
  68. if(check_palindrome(number)) {
  69. uint32_t start,mid,end;
  70. start = 0;
  71. end = str_len - 1;
  72. mid = ((end - start) >> 1) + start;
  73. for(start = mid,(end = (str_len & 1) ? mid : (mid + 1)); (start >= 0 && end < str_len) && (number[start] == '9'); --start,++end) {
  74. number[end] = number[start] = '0';
  75. }
  76. if(start >= 0 && end < str_len) {
  77. number[start]++;
  78. number[end] = number[start];
  79. }
  80. } else {
  81. uint32_t start,mid,end;
  82. bool flag = false;
  83. start = 0;
  84. end = str_len - 1;
  85. mid = ((end - start) >> 1) + start;
  86. for(start = mid, end = ((str_len & 1) ? mid: (mid + 1)); (start >=0 && end < str_len) && (number[start] == number[end]); --start,++end);
  87. if(number[start] < number[end]) {
  88. flag = true;
  89. number[end] = number[start];
  90. }
  91. if(flag) {
  92. for(start = mid, end = ((str_len & 1) ? mid : (mid + 1)); (start >=0 && end < str_len) && (number[start] == '9'); --start,++end) {
  93. number[end] = number[start] = '0';
  94. }
  95. if(start >=0 && end < str_len) {
  96. number[start]++;
  97. number[end] = number[start];
  98. }
  99. }
  100. for(start = 0, end = str_len - 1; (start < end); ++start,--end) {
  101. number[end] = number[start];
  102. }
  103. }
  104. }
Success #stdin #stdout 0s 4400KB
stdin
8
97795375756122352572879826552151654387112262
1892388497169516734992356528466
19891859448286167812
47737795782241879811566697829238862994263278849942632926438725
857751275744476297149515661
699
5119783738665448121162642286
4177118624313412937235746451
stdout
97795375756122352572888827525322165757359779
1892388497169517159617948832981
19891859455495819891
47737795782241879811566697829244292879666511897814228759773774
857751275744484447572157758
707
5119783738665555668373879115
4177118624313443134268117714