#include <iostream> #include <cstdio> #include <cstring> #include <string> int N; using namespace std; const int MAX_N = 5005; int dir[MAX_N]; //牛的方向 (0:F, 1:B) int f[MAX_N]; // 区间 [i, i + K - 1] 是否进行反转 // 固定K, 求对应的最小操作回数 // 无解则返回 -1 void showdir() { for (int i = 0; i < N; i++) cout << dir[i] << " "; cout << endl; } int calc(int K) { memset(f, 0, sizeof(f)); int res = 0, sum = 0; // sum为f的和,确切地说,是指当前正在分析的那头牛,在这个长度为K的区间内,一共被转向几次 for (int i = 0; i + K <= N; i++) { //整个区间划分为多少个长度为K的空间 if ((dir[i] + sum) % 2) { // 对这个长度为K的区间,中的最左端的牛进行判断,若反向,则反转该牛 res++; f[i] = 1; } sum += f[i]; if (i - K + 1 >= 0) { sum -= f[i - K + 1]; } } // 检查剩下的牛是否有面朝后方的情况 // 剩下的牛,指的是不能作为长为 K 的区间的最左端的牛 for (int i = N - K + 1; i < N; i++) { if ((dir[i] + sum) % 2) { // 无解 return -1; } if (i - K + 1 >= 0) // 后面的牛都不可能有自己处的翻转,但是可能有原来波及它的反转,现在由于超出了K,不会再让它反转的情况,减去这种情况 { sum -= f[i - K + 1]; } } return res; } void solve() { int K = 1, M = N; for (int i = 1; i <= N; i++) { int m = calc(i); if (m >= 0 && m < M) { M = m; K = i; } } cout << K << " " << M << endl; } int main() { char c; cin >> N; // getchar(); for (int i = 0; i < N; i++) { cin >> c; dir[i] = (c == 'F')?0:1; } // showdir(); solve(); return 0; }