HDU 5903 (DP)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e3+5; int dp[maxn][maxn]; char s1[maxn]; char p[maxn]; int main() { int T;cin>>T; while(T--) { int n,m; scanf("%d %d",&n,&m); scanf("%s",s1); //dp[i][j],i表示当前位置,j表示当前花费是否合法。 memset(dp,0,sizeof(dp)); dp[n/2][0] = 1; for(int i=n/2;i>=0;i--) { if(s1[i]==s1[i+n/2]) { for(int j=m;j>=0;j--) { if(dp[i+1][j]) dp[i][j] = 1; //不改 } for(int j=m;j>=2;j--) { if(dp[i+1][j-2]) dp[i][j] = 1; //改两次 } } else { for(int j=m;j>=1;j--) { if(dp[i+1][j-1]) dp[i][j] = 1; //改一次 } for(int j=m;j>=2;j--) { if(dp[i+1][j-2]) dp[i][j] = 1; //改两次 } } } if(!dp[0][m]) { printf("Impossible\n"); continue; } for(int i=0;i<n/2;i++) { for(int j=0;j<26;j++) { int count1 = 0; char now = j+'a'; if(now!=s1[i]) count1++; if(now!=s1[i+n/2]) count1++; if(dp[i+1][m-count1]) { p[i] = j+'a'; p[i+n/2] = j+'a'; m = m-count1; break; } } } p[n] = '\0'; printf("%s\n",p); } return 0; }