Codeforces Round #410 (Div. 2)

啦啦啦,最近比较懒所以之前的坑没有填完,也没怎么写新的博客

5月份就要来了,ytz也要开始勤奋的码代码~(≧▽≦)/~啦啦啦

Codeforces Round #410 (Div. 2)

A.Mike and palindrome

题目已经很良心地加粗了重点了,like this

He wants to change exactly one character from the string so that the resulting one is a palindrome.

所以我们需要注意如果原串本身就是回文串的话

那么长度为奇数,中间字符可以随便改,符合题目要求,即更改正好一个字符后仍为回文串

长度为偶数显然没得改,不满足题目要求所以是要输出NO的

#include <bits/stdc++.h>

#define rep(i, j, k) for(int i = j;i <= k;i ++)

#define rev(i, j, k) for(int i = j;i >= k;i --)

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    int n = 0;
    string s;
    cin >> s;
    rep(i, 0, s.size() - 1) 
        n += (s[i] != s[s.size() - 1 - i]);
    if(n == 2 || (n == 0 && (s.size() & 1)))
        puts("YES");
    else puts("NO");
    return 0;
}
View Code

B.Mike and strings

题目不是很难,直接枚举目标串即可

假设string中find函数效率为O(n^2)的话,(实际上大概就是这个效率

效率约为O(n^4),n很小可以接受

#include <bits/stdc++.h>

#define rep(i, j, k) for(int i = j;i <= k;i ++)

#define rev(i, j, k) for(int i = j;i >= k;i --)

using namespace std;

int n, m, k, a[100];
string s[100];

bool work() {
    string t;
    rep(i, 1, n) {
        k = 0;
        rep(j, 1, n) {
            t = s[j] + s[j];
            if(t.find(s[i]) == -1) return 0;
            k += t.find(s[i]);
        }
        m = min(m, k);
    }
    return 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n, m = 666666;
    rep(i, 1, n) cin >> s[i];
    if(work()) cout << m;
    else puts("-1");
    return 0;
}
View Code

另外聊一个很有意思的错误,是我第一次意识流出来的O(n^3)做法

可以参考一下错误之处,看一下你能不能看出来错误

其实是描述有些麻烦

错误代码:

#include <bits/stdc++.h>

#define rep(i, j, k) for(int i = j;i <= k;i ++)

#define rev(i, j, k) for(int i = j;i >= k;i --)

using namespace std;

int n, m, k, a[100];
string s[100];

bool pre() {
    rep(i, 2, n) {
        s[i] += s[i];
        a[i] = s[i].find(s[1]);
        if(a[i] == -1) return 0;
        m += a[i];
     }
     return 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    rep(i, 1, n) cin >> s[i];
    if(pre()) {
        rep(i, 1, s[1].size() - 1) {
            k = i;
            rep(j, 2, n) {
                a[j] ++;
                if(a[j] >= s[1].size()) a[j] -= s[1].size();
                k += a[j];
            } 
            m = min(m, k);
        }
        cout << m;
    }
    else puts("-1");
    return 0;
}
View Code

Wrong answer on test 94:

原文地址:https://www.cnblogs.com/ytytzzz/p/6778285.html