「KTSC 2024 R2」回文判定 题解

· · 题解

唯一场切的 KTSC 题。

首先看到 count_pair 函数的调用次数 A\le\ \lfloor\frac{N}{2}\rfloor+1,如果传入的参数可以相同,那就:

for(int i=0;i<N/2;i++){
  if(count_pair(i,N-i-1,N-i-1)==1)return 0;
}
return 1;

可惜不行。

但我们有一个初步的想法,就是让第三个参数一直为同一个位置,这样就控制了变量,我选择从两边判到中间,取第三个参数为 \lfloor\frac{N}{2}\rfloor

count_pair 函数的返回值只有 013

这下就可以使用 find_character 函数判断 S_{\lfloor\frac{N}{2}\rfloor} 是否与上面返回 1 的位置的数相等了。用 vector 记录下来即可。

vector<int> tmp;
for(int i=0,res;i<N/2;i++){
    res=count_pair(i,N-i-1,N>>1);
    if(res==0)return 0;
    if(res==1)tmp.push_back(i),tmp.push_back(n-i-1);
}
if(!tmp.empty()){
    if(find_character(n>>1,tmp))return 0;
}

然后处理 S_{\lfloor\frac{N}{2}\rfloor}

$N$ 为偶数时 $S_{\lfloor\frac{N}{2}\rfloor-1}$ 还没与 $S_{\lfloor\frac{N}{2}\rfloor}$ 判断是否相等。考虑前面我们知道 $S_i=S_{N-i-1}$,随便取出一组检查一下,将 $S_{\lfloor\frac{N}{2}\rfloor}$ 换成 $S_{\lfloor\frac{N}{2}\rfloor-1}$ 结果是否相等。当然两者结果都为 $1$ 时,只能说明 $S_{\lfloor\frac{N}{2}\rfloor}\neq S_i$ 且 $S_{\lfloor\frac{N}{2}\rfloor-1}\neq S_i$,我们还要让 `count_pair` 在 $S_{\lfloor\frac{N}{2}\rfloor-1}$ 和 $S_{\lfloor\frac{N}{2}\rfloor}$ 以外多加一个参数 $i$,以验证是否相等。 代码如下。 ```cpp #include<bits/stdc++.h> #include "palindrome.h" using namespace std; int guess_palindromicity(int n){ vector<int> tmp; if(n&1){ for(int i=0,res;i<(n-1>>1);i++){ res=count_pair(n>>1,i,n-i-1); if(res==0)return 0; if(res==1)tmp.push_back(i),tmp.push_back(n-i-1); } if(!tmp.empty()){ if(find_character(n>>1,tmp))return 0; } return 1; }else { int c=0; for(int i=0,res;i<(n-1>>1);i++){ res=count_pair(n>>1,i,n-i-1); if(res==0)return 0; if(res==1)tmp.push_back(i),tmp.push_back(n-i-1); if(i==0)c=res; } if(!tmp.empty()){ if(find_character(n>>1,tmp))return 0; } if(count_pair(0,n-1>>1,n>>1)==0||count_pair(n-1,n-1>>1,0)!=c)return 0; return 1; } } ```