ros2_control_demos传感器集成教程:力 torque 传感器与GPIO接口实战
2026/7/30 21:47:46
本题要求生成“困难序列”,定义如下:
一个序列中如果存在两个相邻且相同的子串,则该序列为“简单序列”,否则为“困难序列”。
题目要求按字典序生成第nnn个困难序列,序列中的字符取自字母表前LLL个大写字母(1≤L≤261 \leq L \leq 261≤L≤26)。
输入以两个000结束。
输出时,序列每444个字符一组,组间用空格隔开;若组数超过161616,则从第171717组开始换行。
序列长度不超过808080。
例如,当L=3L = 3L=3时,前777个困难序列为:
A AB ABA ABAC ABACA ABACAB ABACABA题目要求序列中不能包含两个相邻且相同的子串。
例如:ABACBCBAD中CB相邻重复出现,因此是简单序列。
我们需要一个高效的判断函数,对于任意序列,判断其是否合法。
一种直接的判断方法是:
设当前序列为sss,检查所有可能的子串长度jjj(从111到⌊∣s∣2⌋\lfloor \frac{|s|}{2} \rfloor⌊2∣s∣⌋),
对于每个起始位置iii,比较s[i:i+j]s[i:i+j]s[i:i+j]与s[i+j:i+2j]s[i+j:i+2j]s[i+j:i+2j]是否相同。
如果存在相同,则说明有相邻重复子串,序列不合法。
由于序列长度有限(最大808080),且字母表大小LLL不超过262626,
我们可以使用**回溯法(DFS\texttt{DFS}DFS)**按字典序生成序列。
具体步骤:
剪枝优化:
// Krypton Factor// UVa ID: 129// Verdict: Accepted// Submission Date: 2015-12-01// UVa Run Time: 0.000s//// 版权所有(C)2015,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;boolisValid(string line){if(line.length()==1)returntrue;for(intj=1;j<=line.length()/2;j++)for(inti=0;i<line.length()-j;i++)if(line.substr(i,j)==line.substr(i+j,j))returnfalse;returntrue;}voiddisplay(string line){boolnewLinePrinted=false;for(inti=1;i<=line.length();i++){cout<<line[i-1];if(i%64==0){cout<<endl;newLinePrinted=true;}elseif(i%4==0&&i<line.length()){cout<<" ";newLinePrinted=false;}}if(newLinePrinted==false)cout<<endl;cout<<line.length()<<endl;}voidlexicographical(intn,intL){string alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";string line="A";intcounter=1,start=0;while(counter<n){boolfound=false;for(inti=start;i<L;i++){if(alpha[i]==line[line.length()-1])continue;elseif(isValid(line+alpha[i])){found=true;start=0;counter++;line+=alpha[i];break;}}if(found==false){start=line[line.length()-1]-'A'+1;line.erase(line.length()-1,1);}}display(line);}intmain(intac,char*av[]){intn,L;while(cin>>n>>L,n||L)lexicographical(n,L);return0;}本题是一道经典的“困难序列”生成问题,通过回溯法和剪枝可以有效求解。关键点在于理解“相邻重复子串”的判断,以及如何按字典序生成序列。输出格式需要注意分组和换行的规则,避免格式错误导致无法通过。