传送门
题意:
给一个含有T、F的字符串,T表示转向,F表示前进1格。现在可以把其中的T改为F,或F改为T,改变n次(可重复改变某一位置的字母),问相对于起点最远能走多远。
思路:
考虑每一个命令,选择改变或者不改变,当前的决策对于以后产生的影响就是,停在了哪个位置,正朝着哪个方向。由此可以设出状态:dp[i][j][k][d]表示前i个命令,使用了j次机会,当前停留在k位置,正朝着d方向。不妨设初始位置为L,则最右可到达2×L,最左可达到0位置
AC代码:
//
// ................ .................,`..,`.................
// .....=^..=^..=^. .=^..=^..=^..=^..=^..=^..=^...*.........
// ...*,/\`,/\^,\..,\..,\..,/\`,/\`,/\`...*...* ...*,\..,\..,\..,\..,\..,\..,\..=^=^,`,`,`,`
// .,].=^..=^=^,`=^,`=^,`=^=^..=^..=^...,]..,]. .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*.........
// .....................,`..,`..,`..................................... .....,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^..=^..=^..=^.........
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`,/\`,\..,\..,\..,\..,\..,\..,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..=^..,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..........,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.........
// ...*,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .,].=^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.........
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`...*...*
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^...,]..,].
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....................................
// .=^..=^..............................................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ...*,\..,\...\/`.\/`.\/`.\/`,`,`,`,`,`,`,`,`.\/`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=/\`,/\`...*
// .,].,`=^,`=^.[,`.[,`.[,`.[,`.................[,`.[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^=^=^...,].
// .,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.................
// ........ .............................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ,`,`,`,`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// .........[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^.. ...........=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..=^=^.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*..[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^......... .............................................=^..=^..=^..=^..=^.
// ,/\^,\..,\..,\..,\..,\..,\..,\..,`,` .@=^,\..,\..,\..,\..,\..
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^.... ,[\/,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^.. ......
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\.. ,\..,\..,\..=^=^,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^ ,`=^,`=^,`=^=^*.....
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`* .,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^....* .=^.. ......
// ,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..=^.. ,\..=^=^,`,`
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^.. ,`=^=^*.....
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`....* .,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^...*. ....
// ,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// ,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .........=^..=^..=^..=^..=^..=^..=^..=^.....
// .\/`,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .,`..,`..,`..,`..,`..,`..,`..,`.
// ................................
// ,`,`.\/`.\/`.\/`,`,`,`,`
//
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int dx[3];
int dp[150][65][3][3];
const int INF=1e9+10;
void solve(){
string s;
cin>>s;
int n;
cin>>n;
for(int i=0;i<128;i++){
for(int j=0;j<64;j++){
for(int k=0;k<2;k++){
dp[i][j][k][0]=-INF;
dp[i][j][k][1]=INF;
}
}
}
dx[0]=1;
dx[1]=-1;
dp[0][0][0][0]=0;
dp[0][0][0][1]=0;
for(int i=0;i<s.size();i++){
for(int j=0;j<=n;j++){
for(int k=0;k<2;k++){
for(int p=0;p<2;p++){
int op=dp[i][j][k][p];
if(abs(op)<(INF/2)){
if(s[i]=='F'){
dp[i+1][j][k][0]=max(dp[i+1][j][k][0],op+dx[k]);
dp[i+1][j][k][1]=min(dp[i+1][j][k][1],op+dx[k]);
dp[i+1][j+1][!k][0]=max(dp[i+1][j+1][!k][0],op);
dp[i+1][j+1][!k][1]=min(dp[i+1][j+1][!k][1],op);
}
else if(s[i]=='T'){
dp[i+1][j][!k][0]=max(dp[i+1][j][!k][0],op);
dp[i+1][j][!k][1]=min(dp[i+1][j][!k][1],op);
dp[i+1][j+1][k][0]=max(dp[i+1][j+1][k][0],op+dx[k]);
dp[i+1][j+1][k][1]=min(dp[i+1][j+1][k][1],op+dx[k]);
}
}
}
}
}
}
int ans=-1e9;
int op=n%2;
for(int i=op;i<=n;i+=2){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
int pp=abs(dp[s.size()][i][j][k]-0);
if(pp<INF/2){
ans=max(ans,pp);
}
}
}
}
cout<<ans<<"\n";
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
}