fork download
  1. #include <iostream>
  2. #include <utility>
  3. using namespace std;
  4.  
  5. const int MOD = 1000000007;
  6.  
  7. struct Seq {
  8. long long len{0}, ns{0}, sL{0}, sR{0}, ans{0};
  9. pair<long long, char> p1{-1, 0}, p2{-1, 0};
  10. };
  11.  
  12. Seq concat(const Seq &A, const Seq &B) {
  13. Seq S;
  14. S.len = (A.len + B.len) % MOD;
  15. S.ns = (A.ns + B.ns) % MOD;
  16. S.p1 = A.p1.first >= 0 ? A.p1 : make_pair((B.p1.first + A.len) % MOD, B.p1.second);
  17. S.p2 = B.p2.first >= 0 ? make_pair((B.p2.first + A.len) % MOD, B.p2.second) : A.p2;
  18. S.sL = (A.sL + B.sL + B.ns*A.len) % MOD;
  19. S.sR = (A.sR + B.sR + A.ns*B.len) % MOD;
  20. S.ans = (A.ans + B.ans + A.sL*B.len + B.sR*A.len) % MOD;
  21. // Check if there's a new switch.
  22. if (A.p2.first >= 0 && B.p1.first >= 0 && A.p2.second != B.p1.second) {
  23. S.ns++;
  24. long long vL = A.p2.first + 1, vR = (B.len - B.p1.first + MOD) % MOD;
  25. S.sL = (S.sL + vL) % MOD;
  26. S.sR = (S.sR + vR) % MOD;
  27. S.ans = (S.ans + vL*vR) % MOD;
  28. }
  29. return S;
  30. }
  31.  
  32. int K;
  33. string U;
  34.  
  35. int solve() {
  36. cin >> K >> U;
  37. Seq S;
  38. for (int i = 0; i < K; i++) {
  39. Seq S2;
  40. if (U[i] == '.') {
  41. S2 = S;
  42. } else {
  43. S2.len = 1;
  44. if (U[i] != 'F') {
  45. S2.p1 = S2.p2 = make_pair(0, U[i]);
  46. }
  47. }
  48. S = concat(S, S2);
  49. }
  50. return S.ans;
  51. }
  52.  
  53. int main() {
  54. int T;
  55. cin >> T;
  56. for (int t = 1; t <= T; t++) {
  57. cout << "Case #" << t << ": " << solve() << endl;
  58. }
  59. return 0;
  60. }
Success #stdin #stdout 0.01s 5584KB
stdin
2
11
F.F.O.O.X.X
63
FFFFFFOFFFFFFOOFFFFFFOFFFFFFOOXFFFFFFOFFFFFFOOFFFFFFOFFFFFFOOXX
stdout
Case #1: 6380
Case #2: 1918