fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. int n, m;
  17. string s;
  18. int adj[26][26]; // adj[u][v] = Số vị trí mà hai kí tự u và v nằm kề nhau
  19. int dp[1 << 20]; // dp[mask] = Độ trễ của Hoán vị của các chữ cái trong tập mask mà có độ trễ nhỏ nhất
  20.  
  21. int main() {
  22. ios::sync_with_stdio(false);
  23. cin.tie(nullptr);
  24. cin >> n >> m;
  25. cin >> s;
  26.  
  27. for (int i = 0; i + 1 < n; i++) {
  28. int u = s[i] - 'a', v = s[i + 1] - 'a';
  29. adj[u][v]++;
  30. adj[v][u]++;
  31. }
  32.  
  33. for (int mask = 0; mask < (1 << m); mask++) dp[mask] = INF;
  34. dp[0] = 0;
  35.  
  36. for (int mask = 0; mask < (1 << m); mask++) {
  37. // pos là vị trí hiện tại cần xét
  38. int pos = __builtin_popcount(mask);
  39. for (int c = 0; c < m; c++) { // kí tự sẽ điền vào vị trí pos
  40. if ((mask >> c) & 1) continue;
  41. int next_mask = mask | (1 << c);
  42. int cost = 0;
  43. for (int c1 = 0; c1 < m; c1++) {
  44. if (c1 == c) continue;
  45. if ((mask >> c1) & 1) {
  46. cost += adj[c][c1] * pos;
  47. }
  48. else {
  49. cost -= adj[c][c1] * pos;
  50. }
  51. }
  52. minimize(dp[next_mask], dp[mask] + cost);
  53. }
  54. }
  55.  
  56. cout << dp[(1 << m) - 1] << '\n';
  57. }
  58.  
Success #stdin #stdout 0.01s 5280KB
stdin
6 3
aacabc
stdout
5