[Atcoder ARC088 D]Wide Flip

Atcoder ARC 088 D
想了半個小時的結論,結果沒想出來。
我們可以考慮第k 位和第k+1 位,若這兩位不同的話,說明我們至少要進行一次不同時包括這兩個字符的flip 操作,而觀察這個操作,flip [1,m]和flip [m+1,n]的本質是相同的。所以我們設函數F(S)=min(max(k,nk))
我們可以發現K 最多爲F(S) 同時我們可以證明當k=F(S) 時,是可行的

證明過程:
對於 iϵ[1,nk]s[i]s[i+1] 我們可以flip[i+1,n]
對於 iϵ(nk,n)s[i]s[i+1] 我們可以flip[1,i]
這樣我們就可以做到結果了

(atcoder的題目太靈活啊)

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
char s[maxn];
int t,len,l,r;
int main()
{
scanf("%s",s+1);
len=strlen(s+1);
t=0x3f3f3f3f;
   for(int i=1;i<len;++i)
   if(s[i]!=s[i+1]) t=min(t,max(len-i,i));
   if(t==0x3f3f3f3f)
   cout<<len<<endl;
   else 
   cout<<t<<endl; 
 return 0;
 }
發佈了29 篇原創文章 · 獲贊 0 · 訪問量 5246
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章