题解:P14631 [2018 KAIST RUN Fall] Repetitive Palindrome

· · 题解

字符串 s 如果不是回文串的话,那么重复 k 次也一定不是回文串,因为重复的第一遍反着读就已经不是重复的最后一遍了,例如 abca 反着读是 acba,但重复的最后一遍是 abca

字符串 s 如果是回文串的话,k 是偶数时,重复的第 i 遍反着读和重复的第 k-i+1 遍完全相同,所以一定是回文串。k 是奇数时,重复的第 i 遍反着读和重复的第 k-i+1 遍也完全相同,重复的第 \frac{k+1}{2} 遍,也就是最中间的那一遍本身就是回文串,所以整个字符串也是回文串。

因此,如果 s 是回文串,那么它重复 k 遍也一定是回文串。否则,它重复 k 遍一定不是回文串。

所以只需要判断 s 是不是回文串即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ft first
#define sd second
#define fs(i,x,y) for(int i=(x);i<=(y);i++)
#define fj(i,x,y) for(int i=(x);i>=(y);i--)
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    string s;
    cin>>s;
    int l=s.length()-1;
    for(int i=0,j=l;i<j;i++,j--){
        if(s[i]!=s[j]){
            cout<<"NO";
            return 0;
        }
    }
    cout<<"YES";
    return 0;
}