反转基因福娃 发表于 2024-10-17 07:26:45

双指针习题:Kalindrome Array

Kalindrome Array

题目链接:
Kalindrome Array - 洛谷 | 盘算机科学教诲新生态 (luogu.com.cn)
题面翻译

对于长度为 \(m\) 的序列 \(b\),我们称 \(b\) 是「回文的」,当且仅当对于所有 \(i\in\),都有 \(b_i=b_{m-i+1}\)。特别的,空序列也是回文的。
对于一个序列,我们称其是「可爱的」,当且仅当且满足如下条件:

[*]存在数 \(x\),使得删除序列中多少值等于 \(x\) 的元素后,序列是回文的。(删除元素后,剩余元素会并在一起)
需要注意的是,你并不需要删除所有值等于 \(x\) 的元素,并且,你也可以选择不删除任何元素。
例如:

[*]\(\) 是可爱的,由于你不需要删除任何一个数,其本身就是回文的。
[*]\(\) 是可爱的,由于你可以选择 \(x=3\),然后删除所有值等于 \(3\) 的元素,将其变为回文的。
[*]\(\) 则不是可爱的。
现在蓝给出了一个长度为 \(n\) 的序列 \(a\),她盼望你能帮她确定其是否是可爱的。
本题多组数据,数据组数为 \(t\),会在输入的开头给出。对于每组数据,假如给出的序列 \(a\) 是可爱的,请输出 YES,否则输出 NO。
题目数据满足:\(1 \leq t \leq 10^4\),\(1 \leq n \leq 2\times10^5\),\(1 \leq a_i \leq n\),\(1 \leq \sum n \leq 2\times10^5\)。
题目形貌

An array $ $ is a palindrome, if $ b_i = b_{m+1-i} $ for each $ i $ from $ 1 $ to $ m $ . Empty array is also a palindrome.
An array is called kalindrome, if the following condition holds:

[*]It's possible to select some integer $ x $ and delete some of the elements of the array equal to $ x $ , so that the remaining array (after gluing together the remaining parts) is a palindrome.
Note that you don't have to delete all elements equal to $ x $ , and you don't have to delete at least one element equal to $ x $ .
For example :

[*]$ $ is kalindrome because you can simply not delete a single element.
[*]$ $ is kalindrome because you can choose $ x = 3 $ and delete both elements equal to $ 3 $ , obtaining array $ $ , which is a palindrome.
[*]$ $ is not kalindrome.
You are given an array $ $ . Determine if $ a $ is kalindrome or not.
输入格式

The first line contains a single integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single integer $ n $ ( $ 1 \le n \le 2 \cdot 10^5 $ ) — the length of the array.
The second line of each test case contains $ n $ integers $ a_1, a_2, \ldots, a_n $ ( $ 1 \le a_i \le n $ ) — elements of the array.
It's guaranteed that the sum of $ n $ over all test cases won't exceed $ 2 \cdot 10^5 $ .
输特别式

For each test case, print YES if $ a $ is kalindrome and NO otherwise. You can print each letter in any case.
样例 #1

样例输入 #1

4
1
1
2
1 2
3
1 2 3
5
1 4 4 1 4样例输出 #1

YES
YES
NO
YES提示

In the first test case, array $ $ is already a palindrome, so it's a kalindrome as well.
In the second test case, we can choose $ x = 2 $ , delete the second element, and obtain array $ $ , which is a palindrome.
In the third test case, it's impossible to obtain a palindrome.
In the fourth test case, you can choose $ x = 4 $ and delete the fifth element, obtaining $ $ . You also can choose $ x = 1 $ , delete the first and the fourth elements, and obtain $ $ .
思路讲解:

我们首先有一个特例:当原序列是回文序列时,不需要删除任何数字,它本身就是”可爱的“。
这时,我们只需要写出判断一个字符串序列是否是回文序列即可。
我们采用双指针法对数组进行回文序列判断
bool ishuiwen(int n, int b[]){    //若i和n-i+1对应数值差别,肯定不是回文序列        for (int i = 1; ia;        //假如原数组就是回文序列,直接输出YES,进入下一轮循环        if (ishuiwen(n, a)) {                cout
页: [1]
查看完整版本: 双指针习题:Kalindrome Array