首页 > 其他分享 >【Z函数】codeforces 2010 C2. Message Transmission Error (hard version)

【Z函数】codeforces 2010 C2. Message Transmission Error (hard version)

时间:2024-12-16 19:19:57浏览次数:9  
标签:前缀 Transmission hard codeforces 后缀 int 字符串 函数

前言

Z 函数的定义

对于一个字符串 \(s\),定义 Z 函数 \(Z[i]\) 为以 \(s[i]\) 为起始位置的后缀与整个字符串 \(s\) 的最长公共前缀的长度。

Z 函数的应用

  1. 字符串匹配问题

题目

https://codeforces.com/problemset/problem/2010/C2

题意

给定一个字符串 \(s\),若其可以找到真前缀 \(s_1\) 和真后缀 \(s_2\),满足二者相等且存在一个长度大于 \(0\) 的字符串 \(sub\) 既是 \(s_1\) 的后缀,也是 \(s_2\) 的前缀。
若存在,输出 \(YES\) 并换行输出字符串 \(s_1\),否则输出 \(NO\)。

题解

对于条件“存在一个长度大于 \(0\) 的字符串 \(sub\) 既是 \(s_1\) 的后缀,也是 \(s_2\) 的前缀”,只需要枚举的长度满足大于字符串 \(s\) 的一半即可。
对于条件“真前缀 \(s_1\) 和真后缀 \(s_2\) 相等”,可以用 Z 函数判断 \(s_1 == s_2\) 是否成立。从而达到 \(O(n)\) 时间复杂度枚举出全部情况。

参考代码

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

string s;
int n, m;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> s;
	n = s.size();
	m = n / 2 + 1;
	vector<int> z(n);
	z[0] = n;
	for (int i = 1, l, r = 0; i < m; ++ i) {
		if (i <= r) z[i] = min(z[i - l], r - i);
		while (s[z[i]] == s[z[i] + i]) ++ z[i];
		if (i + z[i] > r) l = i, r = i + z[i];
		if (z[i] >= m && r == n) {
			cout << "YES\n" << s.substr(0, z[i]);
			return 0;
		}
	}
	cout << "NO\n";
	return 0;
}

标签:前缀,Transmission,hard,codeforces,后缀,int,字符串,函数
From: https://www.cnblogs.com/RomanLin/p/18606817

相关文章

  • Codeforces Round 993 (Div. 4)
    https://codeforces.com/contest/2044A.EasyProblem签到题。对于大小为n的矩阵,有n-1个a>0&&b>0的(a,b)pair,满足b=n-a。#include<iostream>#include<map>#include<string>usingnamespacestd;intmain(){intt;cin>>t;while(......
  • STM32卡死、跑飞、进入HardFault_Handler如何精准的确定问题
    目录前言一、程序跑飞原因软件原因1.堆栈溢出2.指针操作错误3.中断优先级配置错误4.外设错误配置5.存储器管理问题6.代码逻辑错误7.时钟配置错误8.Watchdog超时硬件原因1.电气问题2.硬件故障软件复位与硬件问题结合二、调试工具如何进入仿真?进入......
  • Codeforces Round 992 (Div. 2) C. Ordered Permutations
    给出数字n,构造一个符合的数组很容易想到,n1时,只有1符合。n2时,有12;21符合。n==3时,有123;132;231;321;发现必须分为1和2——n的两块数字,有某种递归的感觉,答案与2次方有关于是做出代码:#include<iostream>#include<algorithm>usingnamespacestd;#defineffp(x,y......
  • P10370 「LAOI-4」Mex Tower (Hard ver.) 题解
    有一定难度的思维题。题目传送门思路首先,\(\operatorname{mex}(x,y)\)的结果一定为\(0,1,2\),因为只有两个数,所以结果最多为\(2\)(\(x=1,y=0\)或\(x=0,y=1\)时)。因此,可以将问题转化为最后的数是否为\(2\)。考虑倒推,当\(n=1\)时,显然只能为\(2\);要从\(n=2\)的情况变为......
  • 蓝易云 - sharding-jdbc分库连接数优化教程
    在使用Sharding-JDBC进行分库分表时,优化连接数是一个重要的考虑因素。下面是一个关于如何优化Sharding-JDBC分库连接数的简单教程。配置连接池参数:在Sharding-JDBC的数据源配置中,我们可以设置连接池相关的参数来优化连接数。以下是一些常见的连接池参数:minPoolSize:连接池中......
  • P1708 [入门赛 #21] 星云 hard ver. 题解
    思路看到此题,第一想到可以直接枚举,求一个数的数位之和,然后判断,可以就让方案数加一,代码如下:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;intn,k,cnt=0,ans;while(t--){cin>>n>>k;cnt=0;for(inti=1;......
  • Codeforces Round 992 (Div. 2) A~D
    目录A思路代码B思路代码C思路代码D解法\(1\)思路代码解法\(2\)思路代码解法\(3\)思路代码广告:starrycoding\(9\)折优惠码:FV7B04LL\(E\)有空再补构造场,构造低手掉分.A不记得为什么卡了,居然写了\(7\min\).思路\(n\le10^2\),甚至可以使用\(n^3\)算法.枚......
  • 【源码】Sharding-JDBC源码分析之SQL中读写分离动态策略、数据库发现规则及DatabaseDi
     Sharding-JDBC系列1、Sharding-JDBC分库分表的基本使用2、Sharding-JDBC分库分表之SpringBoot分片策略3、Sharding-JDBC分库分表之SpringBoot主从配置4、SpringBoot集成Sharding-JDBC-5.3.0分库分表5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表6、【源码......
  • Codeforces Round 992 (Div. 2) 解题报告
    比赛地址:https://codeforces.com/contest/2040A.GameofDivision题目https://codeforces.com/contest/2040/problem/A题意给你一个长度为\(n\)的整数数组\(a_1,a_2,\ldots,a_n\)和一个整数数组\(k\)。两个玩家正在玩一个游戏。第一个玩家选择一个索引\(1\l......
  • Trails (Hard)
    算法转化题意,对于一个菊花图,每次操作可以去到中心点,再任意找一个外点跑,首先考虑\(\rm{dp}\)的做法对于每一天的后半部分,我们考虑前半天走了长路和前一天走了短路两种情况,显然的,如果前半天走了长路,那么后半天一定要走短路,如果前半天走了短路,后半天走长路和......