daimayuan 三回文序列(代码源)

简介: daimayuan 三回文序列(代码源)

实现方法:

1.先二维前缀将每个数字的前缀和保存,再保存他们前缀增加时候的位置(last数组维护)。

2.然后枚举从1~26的左边=右边长度(k 1 k1k1),然后找到他们前缀有k 1 k1k1x ( 范 围 1 − 26 ) x(范围1-26)x126,后缀有 k 1 k1k1x xx的下标,然后中间找最大k 2 k2k2长度,记录最大值即为答案,时间复杂度O ( m ∗ n ) O(m*n)O(mn).

3.详情看注解。

/*********************************************************************
    程序名:
    版权: Joecai
    作者: Joecai
    日期: 2022-04-11 10:39
    说明:
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
# define rep(i,be,en) for(int i=be;i<=en;i++)
# define pre(i,be,en) for(int i=be;i>=en;i--)
typedef pair<int, int> PII;
#define ll long long
#define endl "\n"
#define LOCAL
#define pb push_back
#define eb emplace_back
#define sp(i) setprecision(i)
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
void solve()
{
  int n;
  cin >> n;
  vector<vector<int>>sum(27, vector<int>(n + 1, 0));//等于sum[26][n],求数字x的前缀和
  vector<vector<int>>last(27, vector<int>(n + 2, 0));//等于last[26][n] 保存i前缀和为j时的下标
  for (int i = 1; i <= n; i++)
  {
    int x;
    cin >> x;
    for (int j = 1; j <= 26; j++)
      sum[j][i] = sum[j][i - 1];//维护前缀和
    sum[x][i]++;
    last[x][sum[x][i]] = i;//更新前缀和对应的下标
  }
  for (int i = 1; i <= 26; i++)
  {
    last[i][sum[i][n] + 1] = last[i][sum[i][n]] + 1;//防止越界,设置一下
  }
  int ans = 0;
  for (int i = 1; i <= 26; i++)
  {
    for (int j = 0; j <= sum[i][n]; j++)
    {
      int l = last[i][j] + 1;
      int r = last[i][sum[i][n] - j + 1] - 1;
      if (l > r) break;
      for (int k = 1; k <= 26; k++)
      {
        int cnt = sum[k][r] - sum[k][l - 1];
        ans = max(ans, j * 2 + cnt);
      }
    }
  }
  cout << ans << endl;
}
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  //#ifdef LOCAL
  //freopen("data.in.txt","r",stdin);
  //freopen("data.out.txt","w",stdout);
  //#endif
  int __ = 1;
  cin >> __;
  while (__--)
  {
    solve();
  }
  return 0;
}


目录
相关文章
【C刷题】矩阵相等判断与序列中删除指定的数字(下)
【C刷题】矩阵相等判断与序列中删除指定的数字(下)
|
6月前
leetcode题解:28.找出字符串中第一个匹配项的下标
leetcode题解:28.找出字符串中第一个匹配项的下标
26 0
|
7月前
|
人工智能 自然语言处理 算法
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
|
7月前
|
算法 Java
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
88 1
|
C语言
【C刷题】矩阵相等判断与序列中删除指定的数字(上)
【C刷题】矩阵相等判断与序列中删除指定的数字(上)
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
104 0
|
C语言
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 输入描述: 输入包含三行, 第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数,用空格分隔。 第三行包含m个整数,用空格分隔。
288 0
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
​判断给定字符序列是否是回文
​判断给定字符序列是否是回文
79 0
序列中删除指定的数字(普通法、双指针法)
序列中删除指定的数字(普通法、双指针法)