#include<bits/stdc++.h> using namespace std; const int maxn = 1e6 + 10; int dp[26][26], n; char str[maxn]; void update() {     int e1 = str[0] - 'a';     int e2 = str[strlen(str)-1] - 'a';     int len = strlen(str);     for(int i = 0;i <= e1;i++)         for(int j = 25;j >= e2;j--)         {             if(e1 == e2 && dp[e1][e2] > 0) // 插入                 dp[i][j] = dp[i][j] + len;             else   // 拼接                 dp[i][j] = max(dp[i][j], dp[i][e1] + len + dp[e2][j]);         } } int main() {     scanf("%d", &n);     for(int i = 0;i < n;i++)     {         scanf("%s", str);         update();     }     printf("%d\n", dp[0][25]); } 时间复杂度O(n)