HDU 3363(分冰糖葫芦)

来源:互联网 发布:apache lucene 编辑:程序博客网 时间:2024/05/17 07:35
#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cstring> #include <vector>#include <set>using namespace std;const int MAXN = 100000 + 10;int T;/*HDU 3363关键:①把串想象成一个环, 只要用一条过圆心的直线把环平分成两条链即可, 而由于它实际上是串, 因此已经被分过一次了, 因此可能还需要至少再分1次或2次②只要平分了一种, 剩下那种肯定也是已经平分的综上可知, 先找一个位置平分一种, 再找到这个位置关于圆心对称的另一个位置即可*/vector<int> cut1(char *str,int tmp){int h = tmp/2, t = (T-tmp)/2;// 一个人需要的H和T的个数 int i,j,k;for(i=j=k=0; i<T ; i++){if( str[i]=='H' ){if( j<h ){j++;}else{break;}}else{if( k<t ){k++;}else{break;}}}vector<int> vec;vec.push_back(i);if( i!=T/2 ){// 要切第二刀vec.push_back(i+T/2); }return vec; }vector<int> cut2(char *str,int tmp){int h = tmp/2, t = (T-tmp)/2;// 一个人需要的H和T的个数 int i,j,k;for(i=T-1, j=k=0; i>=0 ; i--){if( str[i]=='H' ){if( j<h ){j++;}else{break;}}else{if( k<t ){k++;}else{break;}}}i += 1;vector<int> vec;vec.push_back(i);if( i!=T/2 ){// 要切第二刀vec.push_back(i-T/2); }sort(vec.begin(),vec.end());return vec; }int main(){while( (cin>>T) && T>0 ){char str[MAXN];int tmp = 0;memset(str,0,sizeof(str));scanf("%s",str);T = strlen(str);for(int i=0; i<T; i++ ){if( str[i]=='H' ){tmp++;}}if( T%2==1 || tmp%2==1 || (T-tmp)%2==1 ){cout << -1 << endl;continue;}vector<int> vec1 = cut1(str,tmp);vector<int> vec2 = cut2(str,tmp);if( vec1.size()>vec2.size() ){vec1 = vec2;}else if( vec1.size()==vec2.size() && vec1[0]>vec2[0] ){vec1 = vec2;}else if( vec1.size()==vec2.size() && vec1[0]==vec2[0] ){if( vec1.size()==2 && vec1[1]>vec2[1] ){vec1 = vec2;}}cout << vec1.size() << endl;if( vec1.size()==1 ){cout << vec1[0];}else{cout << vec1[0] << " " << vec1[1];}cout << endl;}return 0;}

0 0
原创粉丝点击