fork download
  1. 'use strict';
  2.  
  3. process.stdin.resume();
  4. process.stdin.setEncoding('utf8');
  5.  
  6. var remainder = '';
  7. var inputLines = [];
  8.  
  9. // Đọc input theo từng chunk và gom lại thành các dòng.
  10. process.stdin.on('data', function(chunk) {
  11. var lines = chunk.toString().split('\n');
  12. // Ghép phần dư từ chunk trước (nếu có)
  13. lines[0] = remainder + lines[0];
  14. remainder = lines.pop();
  15. inputLines = inputLines.concat(lines);
  16. });
  17.  
  18. process.stdin.on('end', function() {
  19. if (remainder) {
  20. inputLines.push(remainder);
  21. }
  22. // Giả sử input nằm ở dòng đầu tiên
  23. if (inputLines.length > 0) {
  24. var s = inputLines[0].trim();
  25. var result = computeAnswer(s);
  26. process.stdout.write(result.toString() + "\n");
  27. }
  28. });
  29.  
  30.  
  31. function computeAnswer(s) {
  32. var n = s.length;
  33. var P = new Array(n + 1);
  34. P[0] = 0;
  35. for (var i = 0; i < n; i++) {
  36. if (s.charAt(i) === '(') {
  37. P[i + 1] = P[i] + 1;
  38. } else {
  39. P[i + 1] = P[i] - 1;
  40. }
  41. }
  42. var diff = P[n];
  43. if (diff !== 2 && diff !== -2) {
  44. return 0;
  45. }
  46.  
  47. var minPref = new Array(n + 1);
  48. minPref[0] = P[0];
  49. for (var i = 1; i <= n; i++) {
  50. minPref[i] = Math.min(minPref[i - 1], P[i]);
  51. }
  52. var minSuff = new Array(n + 1);
  53. minSuff[n] = P[n];
  54. for (var i = n - 1; i >= 0; i--) {
  55. minSuff[i] = Math.min(P[i], minSuff[i + 1]);
  56. }
  57.  
  58. var count = 0;
  59. if (diff === -2) {
  60. for (var i = 0; i < n; i++) {
  61. if (s.charAt(i) === ')') {
  62. if (minPref[i] >= 0 && minSuff[i + 1] >= -2) {
  63. count++;
  64. }
  65. }
  66. }
  67. // Đảo '(' thành ')'
  68. for (var i = 0; i < n; i++) {
  69. if (s.charAt(i) === '(') {
  70. if (minPref[i] >= 0 && minSuff[i + 1] >= 2) {
  71. count++;
  72. }
  73. }
  74. }
  75. }
  76. return count;
  77. }
  78.  
Success #stdin #stdout 0.11s 35864KB
stdin
()(())))
stdout
4