Advertisement
Dmaxiya

吊坠 参考代码

Mar 11th, 2025
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int maxn = 200 + 100;
  6. const int maxm = 100 + 100;
  7. struct Edge {
  8.     int u, v, w;
  9. };
  10.  
  11. bool operator<(const Edge &a, const Edge &b) {
  12.     return a.w > b.w;
  13. }
  14.  
  15. int n, m, mm, ecnt, ans;
  16. char str[maxn][maxm];
  17. Edge edge[maxn * maxn];
  18. int fa[maxn];
  19. int dp[maxm][maxm];
  20.  
  21. void init() {
  22.     for (int i = 0; i < n; ++i) {
  23.         fa[i] = i;
  24.     }
  25. }
  26.  
  27. int findF(int x) {
  28.     return x == fa[x] ? x : fa[x] = findF(fa[x]);
  29. }
  30.  
  31. void union_(int x, int y) {
  32.     fa[findF(x)] = findF(y);
  33. }
  34.  
  35. int dis(char *s1, char *s2) {
  36.     int ret = 0;
  37.     for (int i = 1; i <= mm; ++i) {
  38.         for (int j = 1; j <= mm; ++j) {
  39.             if (s1[i] == s2[j]) {
  40.                 dp[i][j] = dp[i - 1][j - 1] + 1;
  41.             } else {
  42.                 dp[i][j] = 0;
  43.             }
  44.             ret = max(ret, dp[i][j]);
  45.         }
  46.     }
  47.     return min(ret, m);
  48. }
  49.  
  50. int main() {
  51. #ifdef ExRoc
  52.     freopen("test.txt", "r", stdin);
  53. #endif
  54.     ios::sync_with_stdio(false);
  55.  
  56.     scanf("%d%d", &n, &m);
  57.     mm = m << 1;
  58.     init();
  59.     for (int i = 0; i < n; ++i) {
  60.         scanf("%s", str[i] + 1);
  61.         memcpy(str[i] + 1 + m, str[i] + 1, sizeof(char) * m);
  62.         for (int j = 0; j < i; ++j) {
  63.             edge[ecnt++] = {i, j, dis(str[i], str[j])};
  64.         }
  65.     }
  66.     sort(edge, edge + ecnt);
  67.     for (int i = 0; i < ecnt; ++i) {
  68.         int u = edge[i].u;
  69.         int v = edge[i].v;
  70.         if (findF(u) != findF(v)) {
  71.             union_(u, v);
  72.             ans += edge[i].w;
  73.         }
  74.     }
  75.     cout << ans << endl;
  76.  
  77.     return 0;
  78. }
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement