2026/5/19 0:17:07
网站建设
项目流程
商城网站的功能,如何做网站域名,山东建设部网站,哪家手表网站题目描述
给定两个小写字母字符串 aaa 和 bbb #xff0c;要求构造一个最短的小写字母字符串 xxx #xff0c;使得 axaxax 和 bxbxbx 这两个拼接字符串中 恰好有一个 是回文串#xff08;即反转后与自身相等#xff09;#xff0c;另一个不是。
输入格式
标准输入包含多组…题目描述给定两个小写字母字符串aaa和bbb要求构造一个最短的小写字母字符串xxx使得axaxax和bxbxbx这两个拼接字符串中恰好有一个是回文串即反转后与自身相等另一个不是。输入格式标准输入包含多组数据每组数据包含两行每行一个字符串。字符串由小写字母组成长度在000到100010001000之间。输出格式对于每组数据输出一行答案字符串xxx。如果存在多个满足条件的xxx选择长度最短且字典序最小的那个。如果不存在这样的xxx输出No solution.。样例输入abab ababab abc def样例输出baba ba题目分析本题要求构造一个字符串xxx使得axaxax和bxbxbx中恰好一个是回文串。我们需要找到最短且字典序最小的解。问题特点回文性质如果sxsxsx是回文串那么它的反转等于自身reverse(sx)sxreverse(sx) sxreverse(sx)sx。结构约束设rev(s)rev(s)rev(s)表示sss的反转。若sxsxsx是回文则有sxreverse(sx)reverse(x)rev(s) s x reverse(sx) reverse(x) rev(s)sxreverse(sx)reverse(x)rev(s)这意味着xxx必须与rev(s)rev(s)rev(s)的某个后缀匹配。关键观察经过推导我们可以得到一个重要结论如果sxsxsx是回文串那么xxx一定是rev(s)rev(s)rev(s)的某个后缀且该后缀对应的前缀是回文串。证明设n∣s∣n |s|n∣s∣m∣x∣m |x|m∣x∣。由于sxsxsx是回文其长度为nmnmnm。考虑字符串的后mmm个字符即xxx。因为回文对称性xxx必须等于rev(s)rev(s)rev(s)的前mmm个字符。同时为了保证整个字符串是回文rev(s)rev(s)rev(s)的前mmm个字符即xxx的反转必须与sss的后mmm个字符匹配。更形式化地可以证明xxx是rev(s)rev(s)rev(s)的后缀且rev(s)rev(s)rev(s)去掉这个后缀后剩下的前缀是回文串。解题思路基于上述观察我们可以设计如下算法1. 特判如果aba bab那么对于任意xxxaxaxax和bxbxbx总是同时为回文或同时不为回文因此不存在解直接输出No solution.。2. 构造候选解对于每个字符串sssaaa或bbb我们构造所有可能的xxx使得sxsxsx是回文串。方法如下计算revreverse(s)rev reverse(s)revreverse(s)。枚举分割点iii从−1-1−1到n−1n-1n−1其中n∣rev∣n |rev|n∣rev∣取prefixrev[0…i]prefix rev[0 \dots i]prefixrev[0…i]当i−1i-1i−1时为空串如果prefixprefixprefix是回文串则xrev[i1…n−1]x rev[i1 \dots n-1]xrev[i1…n−1]是一个候选解额外考虑一种情况在revrevrev前面添加一个字符cccccc从a到z得到crevc revcrev作为候选解。这对应了xxx比revrevrev长一个字符的情况。3. 合并与筛选分别计算aaa和bbb的候选解集合AAA和BBB。合并两个集合去重并按照长度优先、字典序次优先排序。遍历排序后的候选解检查每个xxx是否满足条件axaxax和bxbxbx恰好一个是回文。输出第一个满足条件的xxx。4. 复杂度分析回文判断O(n)O(n)O(n)其中nnn是字符串长度。构造候选解枚举O(n)O(n)O(n)个分割点每个点做一次O(n)O(n)O(n)的回文检查共O(n2)O(n^2)O(n2)。候选解数量O(n)O(n)O(n)个。排序O(nlogn)O(n \log n)O(nlogn)。总复杂度O(n2)O(n^2)O(n2)对于n≤1000n \leq 1000n≤1000完全可行。5. 正确性证明算法的正确性基于上述数学推导我们枚举了所有可能使sxsxsx成为回文的xxx。因此如果存在解它一定在候选解集合中。我们按长度和字典序排序后遍历找到的第一个满足“恰好一个回文”条件的解就是题目要求的最优解。代码实现// Suffidromes// UVa ID: 10262// Verdict: Accepted// Submission Date: 2025-12-24// UVa Run Time: 0.010s//// 版权所有C2025邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;boolcmp(string a,string b){if(a.size()!b.size())returna.size()b.size();returnab;}// 判断回文boolisPalindrome(conststrings){intleft0,rights.size()-1;while(leftright)if(s[left]!s[right--])returnfalse;returntrue;}// 获取所有可能的 x使得 sx 是回文vectorstringgetCandidates(conststrings){vectorstringresult;string sss;reverse(ss.begin(),ss.end());intnss.size();// 枚举分割点 i如果 reversed[0..i] 是回文那么可以取 reversed[i1,n-1] 作为 xfor(inti-1;in;i){string xss.substr(0,i1);if(isPalindrome(x))result.push_back(ss.substr(i1));}// 增加一个字符构成长度为奇数的回文for(charia;iz;i)result.push_back(iss);returnresult;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);string a,b;while(getline(cin,a)){getline(cin,b);// 两个字符串相等则不存在解if(ab){coutNo solution.\n;continue;}if(a.size()b.size())swap(a,b);vectorstringAgetCandidates(a),BgetCandidates(b);for(autos:B)A.push_back(s);sort(A.begin(),A.end(),cmp);A.erase(unique(A.begin(),A.end()));for(autos:A)if(isPalindrome(as)!isPalindrome(bs)||!isPalindrome(as)isPalindrome(bs)){couts\n;break;}}return0;}总结本题的关键在于理解回文串的结构特性从而直接构造候选解避免暴力枚举。通过数学推导我们发现xxx必须是原字符串反转后的某个后缀并且该后缀对应的前缀是回文串。基于这一性质我们可以高效地枚举所有可能的xxx然后从中筛选出满足条件的最优解。这种方法的时间复杂度为O(n2)O(n^2)O(n2)空间复杂度为O(n)O(n)O(n)对于n≤1000n \leq 1000n≤1000的数据范围完全足够。