有需要看我前一篇题解的点这里
废话不多说,赶紧开始!
3.回文//本题借鉴了一下别人的算法
令s1=L
找出与 a1 的唯一一个位置,记作p,则序列被划分为两段,a[2...p-1]和a[p+1...2n]。
可以将这两段分别看成两个栈:栈 T1:a[2...p-1]的栈顶为22,栈底为p−1。
栈T2:a[p+1...2n]的栈顶为2n,栈底为p+1。
则问题转化为每次可以取走这两个栈之一的栈顶,令最终得到的串是回文串。
自然,只有存在某个数x,既在栈顶,又在栈底才能取走。否则无解。可以分类讨论一下:如果数x在栈Ti 的栈顶和栈Ti 的栈底,可以先取走Ti 栈顶,当另一个栈取空后,再取空Ti,这样的方案显然是合法的。如果数x在栈Ti 栈顶和栈 T3-i的栈底,可以先取走Ti 栈顶,当Ti 被取空后,再取空T3−i,显然也是合法的。
这样就可以从两个栈中直接消除掉数x的影响,归纳构造方案。由于要求字典序最小,所以可以每次优先取T1的栈顶。如果过程中找不到可以取的栈顶,则无解。
上代码~~
#includeusing namespace std; int n; char res[1000005]; int a[1000005]; inline int read() { register int x=0,f=1;register char s=getchar(); while(s>'9'||s<'0') {if(s=='-') f=-1;s=getchar();} while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();} return x*f; } inline bool work(int l1,int r1,int l2,int r2) { for(register int i=1;i 4.交通规划 本题题解来自于这里
//为什么最后一篇不手打呢?
//最后一题的难度是省选级别的题目,个人感觉放在提高组难度太大
//所以并没有搬运



