Advertisement
a53

text3

a53
May 4th, 2022
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. /// Dana Lica - C.J. Ex. PH
  2. #include <fstream>
  3. #include <cstring>
  4. #include <cassert>
  5.  
  6. using namespace std;
  7.  
  8. ifstream f("text.in");
  9. ofstream g("text.out");
  10.  
  11. const int NMAX = 2e5 + 1;
  12. const int INF = 1e9;
  13.  
  14. int P;
  15.  
  16. int T;
  17. char V[NMAX];
  18.  
  19. int N, M;
  20.  
  21. int pal_Max = 0;
  22. string Container, Sol;
  23.  
  24. int H[NMAX];
  25. int K, Stack[NMAX];
  26. int Left[NMAX], Right[NMAX];
  27.  
  28. void Read ()
  29. {
  30. assert(f >> P);
  31. assert(P == 1 || P == 2 || P == 3);
  32.  
  33. assert(f.get());
  34.  
  35. bool spaces = 0;
  36. bool minn = 0;
  37. bool maxn = 0;
  38. bool en = 0;
  39.  
  40. int TOTAL = 0;
  41.  
  42. char Ch = 0;
  43. while(f.get(Ch))
  44. {
  45. if(Ch == '\n')
  46. {
  47. en = 1;
  48.  
  49. break;
  50. }
  51.  
  52. ++TOTAL;
  53.  
  54. assert(Ch == ' ' || (Ch >= 'a' && Ch <= 'z') || (Ch >= 'A' && Ch <= 'Z'));
  55.  
  56. spaces |= (Ch == ' ');
  57. minn |= (Ch >= 'a' && Ch <= 'z');
  58. maxn |= (Ch >= 'A' && Ch <= 'Z');
  59.  
  60. if((Ch >= 'a' && Ch <= 'z') || (Ch >= 'A' && Ch <= 'Z'))
  61. V[++T] = Ch;
  62. }
  63.  
  64. assert(spaces && minn && maxn && en);
  65. assert(TOTAL >= 2 && TOTAL <= 2e5);
  66.  
  67. return;
  68. }
  69.  
  70. void Max_Pal (string S)
  71. {
  72. int Size = (int)S.size() - 1;
  73.  
  74. /// LUNGIME == 1 (MODULO 2):
  75. for(int i = 1; i <= Size; ++i)
  76. {
  77. int lg = 1;
  78. int left = i - 1, right = i + 1;
  79.  
  80. while(left >= 1 && right <= Size && S[left] == S[right])
  81. lg += 2, --left, ++right;
  82.  
  83. string now;
  84. for(int pos = left + 1; pos < right; ++pos)
  85. now += S[pos];
  86.  
  87. if(lg > pal_Max || (lg == pal_Max && now > Sol))
  88. pal_Max = lg, Sol = now;
  89. }
  90. ///
  91.  
  92. /// LUNGIME == 0 (MODULO 2):
  93. for(int i = 1; i < Size; ++i)
  94. if(S[i] == S[i + 1])
  95. {
  96. int lg = 2;
  97. int left = i - 1, right = i + 2;
  98.  
  99. while(left >= 1 && right <= Size && S[left] == S[right])
  100. lg += 2, --left, ++right;
  101.  
  102. string now;
  103. for(int pos = left + 1; pos < right; ++pos)
  104. now += S[pos];
  105.  
  106. if(lg > pal_Max || (lg == pal_Max && now > Sol))
  107. pal_Max = lg, Sol = now;
  108. }
  109. ///
  110.  
  111. return;
  112. }
  113.  
  114. int MAX (int a, int b)
  115. {
  116. return ((a > b) ? a : b);
  117. }
  118.  
  119. int main()
  120. {
  121. Read();
  122.  
  123. int Min = INF;
  124. for(int d1 = 1; d1 * d1 <= T; ++d1)
  125. if(T % d1 == 0)
  126. {
  127. int d2 = T / d1;
  128.  
  129. if((d2 - d1) < Min)
  130. Min = (d2 - d1), N = d1, M = d2;
  131. }
  132.  
  133. assert(N > 1);
  134.  
  135. char A[N + 1][M + 1];
  136. for(int i = 1; i <= N; ++i)
  137. for(int j = 1; j <= M; ++j)
  138. A[i][j] = V[((i - 1) * M + j)];
  139.  
  140. if(P == 1)
  141. {
  142. for(int i = 1; i <= N; ++i)
  143. {
  144. for(int j = 1; j <= M; ++j)
  145. g << A[i][j];
  146.  
  147. g << '\n';
  148. }
  149.  
  150. return 0;
  151. }
  152.  
  153. if(P == 2)
  154. {
  155. for(int i = 1; i <= N; ++i)
  156. {
  157. Container = "0";
  158. for(int j = 1; j <= M; ++j)
  159. Container.push_back(A[i][j]);
  160.  
  161. Max_Pal(Container);
  162. }
  163.  
  164. for(int j = 1; j <= M; ++j)
  165. {
  166. Container = "0";
  167. for(int i = 1; i <= N; ++i)
  168. Container.push_back(A[i][j]);
  169.  
  170. Max_Pal(Container);
  171. }
  172.  
  173. g << Sol << '\n';
  174.  
  175. return 0;
  176. }
  177.  
  178. int ans = 0;
  179.  
  180. for(int i = 1; i <= N; ++i)
  181. {
  182. for(int j = 1; j <= M; ++j)
  183. {
  184. char X = A[i][j];
  185. if(X >= 'A' && X <= 'Z')
  186. X = tolower(X);
  187.  
  188. if(X == 'a' || X == 'e' || X == 'i' || X == 'o' || X == 'u')
  189. ++H[j];
  190. else
  191. H[j] = 0;
  192. }
  193.  
  194. K = 0;
  195. for(int j = 1; j <= M; ++j)
  196. {
  197. while(K && H[j] < H[Stack[K]])
  198. Right[Stack[K]] = j, --K;
  199.  
  200. Stack[++K] = j;
  201. }
  202. for(int x = 1; x <= K; ++x)
  203. Right[Stack[x]] = (M + 1);
  204.  
  205. K = 0;
  206. for(int j = M; j >= 1; --j)
  207. {
  208. while(K && H[j] < H[Stack[K]])
  209. Left[Stack[K]] = j, --K;
  210.  
  211. Stack[++K] = j;
  212. }
  213. for(int x = 1; x <= K; ++x)
  214. Left[Stack[x]] = 0;
  215.  
  216. for(int j = 1; j <= M; ++j)
  217. {
  218. int now = ((Right[j] - 1) - (Left[j] + 1) + 1);
  219.  
  220. ans = MAX(ans, H[j] * now);
  221. }
  222. }
  223.  
  224. g << ans << '\n';
  225.  
  226. return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement