傳送門
題目描述
所謂回文串,就是對於給定的字串,正著讀和反著讀都一樣,比如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...