列表

详情


NC219734. 写春联

描述

小蓝的爷爷是个书法爱好家,今年的春联也是爷爷亲手写的,但是小蓝的妹妹小兰非常淘气,故意将爷
爷的句子反着写一遍,为了转移小兰的注意力,爷爷决定出个题考考她。

对于一个字符串 s ,设它翻转后的字符串为  ,操作序列为  a_i,  。刚开始纸上是空白的,当 
 时,爷爷连续写下 a_i 个 s ;当  时,小兰连续写下 a_i 个  。

试判断最终连接而成的字符串是否为回文串。

输入描述

多组输入,每组输入包括三行。

第一行一个字符串 s (  )。

第二行一个数字 n (  ),表示操作数。

第三行 n 个数字 a_i (  )。

对于多组数据,保证  。

输出描述

对于每组输入输出一行,如果全部操作得到的是回文串,输出 Yes ;否则,输出 No 。

示例1

输入:

abc
4
1 3 -2 -2
acd
4
1 3 -2 -3

输出:

Yes
No

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 287ms, 内存消耗: 8036K, 提交时间: 2021-03-20 18:54:11

#include <bits/stdc++.h>
using namespace std;
string s;
bool solve() {
    int n;
    cin>>n;
    vector<int>a(n);
    for(int i=0; i<n; ++i) cin>>a[i];
    bool flag = true;
    for(int i=0; i<(int)s.length()/2; ++i)
        if(s[i]!=s[(int)s.length()-1-i])
            flag = false;
    if(flag) return flag;
    flag = true;
    int l=0,r=n-1;
    while(l<=r) {
        if(a[l]*a[r]>0) {
            flag = false;
            break;
        }
        if(abs(a[l])==abs(a[r]))
            --r,++l;
        else if(abs(a[l])>abs(a[r]))
            a[l]+=a[r],--r;
        else
            a[r]+=a[l],++l;
    }
    return flag;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    while (cin>>s) {
        if(solve()) cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

上一题