列表

详情


NC234864. 造桥

描述

今天是愉快的周末,牛可乐和牛妹在一起玩游戏。牛妹给了牛可乐  个造桥的零件,每个零件以字符串的形式给出,每个字符串两端的字符是零件的接口,两个零件可以通过连接不同端的接口(一个零件的左端只能连接另一个零件的右端,右端则只能连接左端)得到一个更长的零件,新零件的长度是原零件的长度之和。
牛妹规定,零件不能翻转,且零件左边的接口只能由该零件左边的零件去连接(这意味着,应该按顺序选取零件),右端同理。
牛可乐想得到牛妹的赞许,因此他要想用牛妹给的零件拼接一个尽可能长的桥梁,你能帮帮他吗?

输入描述

第一行一个整数  ,代表案例数。

对于每一个案例:第一行一个数  ,表示字符串的个数。

    接下来有  行,每行一个字符串,每个字符串的长度  。
所有案例的字符串长度的和不超过
保证所有字符均为小写字符。

输出描述

  个字符串能拼接的最大字符串长度。

示例1

输入:

1
6
ab
baabc
bb
ba
ba
ad

输出:

8

说明:

按顺序依次拼接:1,3,5,6号字符串。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 27ms, 内存消耗: 760K, 提交时间: 2023-08-11 22:48:37

#include<bits/stdc++.h>
using namespace std;

int main(){
  int T; cin >> T;
  while (T--) {
    int n; cin >> n;
    map<char, int> M;
    while (n--) {
      string s; cin >> s;
      M[s.back()] = max(M[s.back()], M[s[0]]+(int)s.size());
    }
    int best = 0;
    for (auto [k, v]: M) best = max(best, v);
    cout << best << endl;
  }
  
}

Python3 解法, 执行用时: 350ms, 内存消耗: 11904K, 提交时间: 2022-06-26 14:16:35

T = int(input())
for _ in range(T):
    n = int(input())
    s = []
    for i in range(n):
        s.append(input())
    f = [0]*26
    for i in range(n):
        o1 = ord(s[i][0])-97
        o2 = ord(s[i][-1])-97
        f[o2] = max(f[o2],f[o1]+len(s[i]))
    print(max(f))

上一题