洛谷P5041 HAOI2009 求回文串

2021-10-04 16:15:55 字數 1404 閱讀 5033

傳送門

題目描述

所謂回文串,就是對於給定的字串,正著讀和反著讀都一樣,比如abcba就是乙個回文串,abcab則不是。我們的目標是對於任意輸入的字串,不斷將第i個字元和第i+1個字元交換,使得該串最終變為回文串。求最少交換次數。

輸入格式

乙個由大寫字母字母組成的字串。

輸出格式

若能經過有限次操作能將原串變為回文串,則輸出最少操作次數;否則輸出-1。

考慮貪心,從左往右算

#include

#include

#include

#include

#include

#define int long long

using

namespace std;

const

int maxn=

1e6+10;

char ch[maxn]

;int a[maxn]

,ans[maxn]

,s[maxn]

,b[maxn]

,vis[maxn]

,viss[maxn]

,len,cal;

vector<

int>q[30]

;int sum;

inline

void

init()

for(

int i=

1;i<=len;i++)}

return;}

void

solve

(int l,

int r)

for(

int i=l;i<=r;i++

) ans[i]

=b[i];}

main()

}}int l=

1,r=len;

int pp=1;

while

(pp<=len)

if(pp>len||l>r)

break

; ans[l]

=pp;

viss[pp]=1

; l++

; pp++

;int lgr=q[a[pp-1]

][q[a[pp-1]

].size()

-1];

ans[r]

=lgr;

viss[lgr]=1

; r--

; q[a[pp-1]

].erase

(q[a[pp-1]

].end()-

1);}

solve(1

,len)

;printf

("%lld"

,sum);}

return0;

}

P5041 HAOI2009 求回文串

所謂回文串,就是對於給定的字串,正著讀和反著讀都一樣,比如abcba就是乙個回文串,abcab則不是。我們的目標是對於任意輸入的字串,不斷將第i個字元和第i 1個字元交換,使得該串最終變為回文串。求最少交換次數。乙個由大寫字母字母組成的字串。若能經過有限次操作能將原串變為回文串,則輸出最少操作次數 ...

洛谷 P2513 HAOI2009 逆序對數列

對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?輸入格式 第一行為兩個整數n,k。輸出格式 寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對...

貪心 洛谷 3173 HAOI2009 巧克力

題目 既然每一刀都要切,那肯定代價越大的要越早切,考慮按代價降序排序,如果切了一行,求切列的時候貢獻的行數就多了1。include include include define rr register using namespace std struct reca 20011 int n,m,ans...