標籤:style blog http color os 2014
原題 HDU 3363 http://acm.hdu.edu.cn/showproblem.php?pid=3363
給你一個串,串中有H跟T兩種字元,然後切任意刀,使得能把H跟T各自分為原來的一半。
解法: 把串想象成一個環,只要滿足H跟T都為偶數個,那麼就可以做一條過圓心的直線把H跟T平分掉,過直線,只要考慮平分H或者T中的一個就可以了,因為直線本來就把環平分,而此時平分了H或者T,那麼剩下的那個也是平分掉的。
具體證明: http://hi.baidu.com/superlong/item/fa552253eb9b71c09f266703
類似於維護這樣一條掃描線:
代碼:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define N 100007char ss[N];int main(){ int len,ka,kb,i,j; int h,t,H,T; while(scanf("%d",&len)!=EOF && len) { scanf("%s",ss); H = T = 0; for(i=0;i<len;i++) { if(ss[i] == ‘H‘) H++; else T++; } if(H%2 || T%2) { puts("-1"); continue; } int mid = len/2; h = t = 0; for(i=0;i<mid;i++) { if(ss[i] == ‘H‘) h++; else t++; } if(h == H/2 && t == T/2) { puts("1"); printf("%d\n",mid); continue; } ka = 0; //尾端 kb = mid; //前端 int flag = 0; while(ka < mid-1) { if(ss[ka] == ‘H‘) //尾端掃出去的字母 h--; else t--; if(ss[kb] == ‘H‘) //前端掃進來的字母 h++; else t++; ka++,kb++; //轉 if(h == H/2 && t == T/2) { flag = 1; break; } } if(flag) { puts("2"); printf("%d %d\n",ka,kb); } else puts("-1"); } return 0;}
View Code