#include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include <vector> #include <set> using namespace std; #define maxn 5000 + 10 #define INF 0x7ffffff int n; int a[maxn]; int f[maxn]; ///区间[i, i+k-1]是否进行反转 int mark; int Cal(int k) { memset(f, 0, sizeof(f)); int res = 0; int sum = 0; ///每次使得sum的值为(i-k+1 ~ i-1)的f[i]的和 for(int i=1; i<=n-k+1; i++) { if((sum&1) && a[i]) { f[i]++; res++; } if(!(sum&1) && !a[i]) { f[i]++; res++; } sum += f[i]; if(i-k+1 > 0) sum -= f[i-k+1]; } for(int i=n-k+2; i<=n; i++) { if((sum + a[i]) % 2 == 0) { return INF; break; } if(i-k+1 > 0) sum -= f[i-k+1]; } return res; } void solve() { mark = -1; int Min = INF; for(int k=1; k<=n; k++) { int tmp = Cal(k); if(tmp < Min) { Min = tmp; mark = k; } } cout<<mark<<" "<<Min<<endl; } int main() { while(~scanf("%d", &n)) { char ch; for(int i=1; i<=n; i++) { getchar(); scanf("%c", &ch); if(ch == 'F') a[i] = 1; else a[i] = 0; } solve(); } return 0; }
原文地址:http://blog.csdn.net/dojintian/article/details/45077831