模擬· CodeForces - 748B · Santa Claus and Keyboard Check

題目大意:

給你兩份文本,兩個文本中有相應的字符位置調換了,問你是否可以將A串中的某些字符調換後和B串相等。

解題思路:

同一個字符只能和一個字符位置調換,以樣例爲例:

helloworld
ehoolwlroz

h----e

l-----o

d----z

如果是

hellaworld
ehoolwlroz

就不對了;

因此我們所要做的就不那麼麻煩了,只需要記錄下對應字母所應該調換的字符,並保存下來,下次出現了這一字符判斷是否是對應調換的即可;

有一點要注意的是:

lll
llo

這個樣例是錯誤的,也就是-1,因爲是將A中的替換成B中的,所以我們如果替換成O的話A串爲OOO與B不相等。

AC代碼:

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;
//#define   maxd          1010
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define   mc(x, y)     memcpy(x, y, sizeof(x))
#define   ms(x,y)      memset(x,y,sizeof(x))
#define   rep(i,n)      for(int i=0;i<(n);i++)
#define   repf(i,a,b)   for(int i=(a);i<=(b);i++)
#define   PI           pair<int,int>
//#define   mapp            make_pair
#define   FI            first
#define   SE            second
#define   IT            iterator
#define   PB            push_back
#define   Times         10
typedef   long long     ll;
typedef   unsigned long long ull;
typedef   long double   ld;
typedef   pair<int,int > pce;
//#define N 100
const double eps = 1e-10;
const double  pi = acos(-1.0);
const  ll    mod = 1e9+7;
const  int   inf = 0x3f3f3f3f;
//const  ll    INF = (ll)1e18+300;
const int   maxd = 1100 + 10;
const int   maxx = 10100;

char ac[maxd],bc[maxd];
int vis[maxd];
int ans[maxd];

int main()
{
    while(~scanf("%s",ac)) {
        scanf("%s",bc);
        ms(vis, 0);
        int len = strlen(ac);
        int flag = 1;
        int num = 0;
        for(int i = 0; i < len; i++) {
            int res = ac[i] - 'a' + 1;
            int cnt = bc[i] - 'a' + 1;
            if(!vis[res] && !vis[cnt]) {
                vis[res] = cnt;
                vis[cnt] = res;
                if(ac[i] != bc[i]) {
                    ans[++num] = res;
                }
            }
            else if(cnt != vis[res] || res != vis[bc[i]-'a'+1]) {
                flag = 0;
            }
        }
        if(!flag) {
            cout << "-1" << endl;
            continue;
        }
        cout << num << endl;
        for(int i = 1; i <= num; i++) {
            char res = ans[i] + 'a' - 1;
            char cnt = vis[ans[i]] + 'a' - 1;
            cout << res << " " << cnt << endl;
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章