当前位置: 首页 > news >正文

2025牛客五一集训派对day4

C

其实就是比较 a+b 和 b+a 的字典序然后加入res中即可

python中可以用cmp_to_key将比较函数传入key中

n=int(input())
nums=[]for i in range(n):nums.append(input())from functools import cmp_to_keydef compare(a, b):# 比较 a + b 和 b + a 的字典序if a + b < b + a:return -1elif a + b > b + a:return 1else:return 0sorted_nums = sorted(nums, key=cmp_to_key(compare))result = ''.join(sorted_nums)print(result)

但是会TLE,转为C++就不会了

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;bool compare(const string &a, const string &b) {return a + b < b + a;
}int main() {int n;cin >> n;  vector<string> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}sort(nums.begin(), nums.end(), compare);string result = "";for (const auto &num : nums) {result += num;}cout << result << endl;  return 0;
}

H

构建后缀自动机SAM快速查找任意子字符串

计算bi的前缀和数组并用稀疏表快速查找区间最小值,从而计算最大区间权重和

import sys
import mathclass State:def __init__(self):self.next = [-1] * 26  # Using array for transitions, ord(c) - ord('a')self.link = -1self.len = 0def build_sam(s):ord_a = ord('a')size = 1last = 0states = [State()]for c in s:c_ord = ord(c) - ord_ap = lastcurr = sizestates.append(State())states[curr].len = states[p].len + 1while p >= 0 and states[p].next[c_ord] == -1:states[p].next[c_ord] = currp = states[p].linkif p == -1:states[curr].link = 0else:q = states[p].next[c_ord]if states[p].len + 1 == states[q].len:states[curr].link = qelse:clone = size + 1states.append(State())states[clone].len = states[p].len + 1states[clone].next = list(states[q].next)states[clone].link = states[q].linkwhile p != -1 and states[p].next[c_ord] == q:states[p].next[c_ord] = clonep = states[p].linkstates[q].link = clonestates[curr].link = clonesize = clonelast = currsize += 1return statesdef process_b(sam, b):n = len(b)max_len = [0] * ncurrent = 0length = 0ord_a = ord('a')for i in range(n):c = b[i]c_ord = ord(c) - ord_awhile current != 0 and sam[current].next[c_ord] == -1:current = sam[current].linklength = sam[current].lenif sam[current].next[c_ord] != -1:current = sam[current].next[c_ord]length += 1else:current = 0length = 0max_len[i] = lengthreturn max_lenclass SparseTable:def __init__(self, data):n = len(data)self.log_table = [0] * (n + 1)for i in range(2, n + 1):self.log_table[i] = self.log_table[i // 2] + 1self.k = self.log_table[n] + 1self.st = []self.st.append(data.copy())j = 1while (1 << j) <= n:curr = []for i in range(n - (1 << j) + 1):val = min(self.st[j-1][i], self.st[j-1][i + (1 << (j-1))])curr.append(val)self.st.append(curr)j += 1def query_min(self, l, r):if l > r:return float('inf')length = r - l + 1k = self.log_table[length]return min(self.st[k][l], self.st[k][r - (1 << k) + 1])n,m,k=map(int,input().split())A=input()
v=list(map(int,input().split()))B_list=[]
for i in range(k):B_list.append(input())sam = build_sam(A)for b in B_list:max_len = process_b(sam, b)sum_vals = [0] * (m +1)for i in range(m):sum_vals[i+1] = sum_vals[i] + v[i]st = SparseTable(sum_vals)max_sum = 0for i in range(m):current_max_len = max_len[i]if current_max_len ==0:continuea_start = i - current_max_len +1if a_start <0:a_start =0a_end = iif a_start > a_end:continuemin_val = st.query_min(a_start, a_end)current_sum = sum_vals[i+1] - min_valif current_sum > max_sum:max_sum = current_sumprint(max(max_sum, 0))

相关文章:

  • OpenCV入门指南:从环境搭建到第一个图像处理程序
  • 【RocketMQ Broker 相关源码】- broker 启动源码(2)
  • level2.5 函数高阶
  • 气泡图、桑基图的绘制
  • MySQL--索引精通详解
  • TestBench激励与待测
  • 驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析
  • 引入spdlog后程序链接很慢
  • 系统思考:核心价值与竞争力
  • Python绘制误差棒:深入解析数据的不确定性
  • 比HashTable更先进的ConcurrentHashMap及其多线程协助扩容机制
  • 汇编常用语法
  • Spring的数据库编程
  • Linux:web服务
  • Warp调度器:藏在显卡里的时间管理大师
  • 【vue3】黑马程序员前端Vue3小兔鲜电商项目【八】
  • Flowable7.x学习笔记(十九)归还我的待办
  • ARM寻址方式
  • 【时时三省】(C语言基础)怎样定义和引用一维数组
  • 【Redis】Redis常用命令
  • 干细胞从科研到市场应用有多远?发展还面临何挑战?
  • 《开始推理吧3》:演员没包袱,推理更共情
  • AI世界的年轻人|研究不止于实验室,更服务于遥远山区
  • 澳大利亚大选今日投票:聚焦生活成本与“特朗普问题”
  • 菏泽家长“付费查成绩”风波调查:免费功能被误读
  • 龚正盛秋平王晓真共同启动2025国际消费季暨第六届上海“五五购物节”