fork(5) download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct data
  6. {
  7. int hv_1;
  8. int hv_A;
  9. int hv_a;
  10. } typedef data;
  11.  
  12. data pass[1000006];
  13.  
  14. int check_safe (int begin, int end)
  15. {
  16. int num_1=pass[end].hv_1-pass[begin-1].hv_1;
  17. int num_a=pass[end].hv_a-pass[begin-1].hv_a;
  18. int num_A=pass[end].hv_A-pass[begin-1].hv_A;
  19. if (num_1>0 && num_a>0 && num_A>0 && end-begin+1>=6) return 1;
  20. else return 0;
  21. }
  22.  
  23. int BSearch (int begin, int front, int back)
  24. {
  25. int vt=-1;
  26. while (front<=back && back-begin+1>=6)
  27. {
  28. int mid = (front+back)/2;
  29. if (check_safe (begin, mid)==1)
  30. {
  31. vt=mid;
  32. back=mid-1;
  33. }
  34. else front=mid+1;
  35. }
  36. return vt;
  37. }
  38.  
  39. int main ()
  40. {
  41. string xau;
  42. cin>>xau;
  43. pass[0].hv_1=0;
  44. pass[0].hv_a=0;
  45. pass[0].hv_A=0;
  46. int n=xau.length();
  47. for (int i=1; i<=n; i++)
  48. {
  49. if (xau[i-1]>='0' && xau[i-1]<='9')
  50. {
  51. pass[i] = pass[i-1];
  52. pass[i].hv_1++;
  53. }
  54. else if (xau[i-1]>='a' && xau[i-1]<='z')
  55. {
  56. pass[i] = pass[i-1];
  57. pass[i].hv_a++;
  58. }
  59. else if (xau[i-1]>='A' && xau[i-1]<='Z')
  60. {
  61. pass[i] = pass[i-1];
  62. pass[i].hv_A++;
  63. }
  64. }
  65. long long count=0;
  66. for (int i=1; i<=xau.length()-6+1; i++)
  67. {
  68. int VT = BSearch (i, i, n);
  69. if (VT!=-1)
  70. {
  71. count+=n-VT+1;
  72. } else break;
  73. }
  74. cout<<count;
  75. return 0;
  76. }
Success #stdin #stdout 0s 27776KB
stdin
abc3456789PQ
stdout
6