Codeforces Round #296 (Div. 2) - B. Error Correct System(脑洞)

来源:互联网 发布:2016年进出口数据 编辑:程序博客网 时间:2024/06/16 22:37

题目:

http://codeforces.com/contest/527/problem/B

题意:

给出两串n(1 ≤ n ≤ 200 000)个字母的字符串, 求出最多交换一对数, 使得不相同对数变少,求出不相同的对数以及交换的数的位置,若不需交换则输出-1,-1.

思路:

用矩阵记录两个串相同位置不同的字母, 并记录每一个出现的字母的位置. 计算不相同的对数ans.

先枚举一遍字符串, 若f[i][j] == f[j][i] == 1, 则ans -= 2;

否则不相同的字母对中t字母中s串存在, 则交换,且ans--.

AC.

#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <cstring>using namespace std;const int maxn = 200005;char s[maxn], t[maxn];bool f[30][30];vector<int> v[30];int n, ans;void solve(){    int a = -1, b = -1;    bool ok1 = 0, ok2 = 0;    for(int i = 0; i <= 25; ++i) {        for(int j = 0; j <= 25; ++j) {            if(f[i][j] && f[j][i]) {                ans -= 2;                for(int k = 0; k < n; ++k) {                    if(!ok1 && s[k]-'a' == i && t[k]-'a' == j) {                        a = k+1;                        ok1 = 1;                    }                    if(!ok2 && s[k]-'a' == j && t[k]-'a' == i) {                        b = k+1;                        ok2 = 1;                    }                    if(ok1 && ok2) {                        printf("%d\n%d %d\n", ans, a, b);                        return;                    }                }            }        }    }    for(int i = 0; i < n; ++i) {        if(s[i] != t[i]) {            if(v[t[i]-'a'].size() == 0) continue;            ans--;            a = i+1; b = v[t[i]-'a'][0]+1;            printf("%d\n%d %d\n", ans, a, b);            return;        }    }    printf("%d\n%d %d\n", ans, a, b);    return;}int main(){//freopen("in", "r", stdin);    while(~scanf("%d", &n)) {        memset(f, 0, sizeof(f));        scanf("%s%s", s, t);        ans = 0;        for(int i = 0; i < n; ++i) {            if(s[i] != t[i]) {                ans++;                f[s[i]-'a'][t[i]-'a'] = 1;                v[s[i]-'a'].push_back(i);            }        }        solve();    }    return 0;}


0 0
原创粉丝点击