Hướng dẫn giải của Biến đổi chuỗi


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

uses math;
var s,a,b:string;
    i,x,y:longint;

function c(x,y:longint):longint;
begin
     if x<y then c:=min(y-x,x+26-y)
     else c:=min(x-y,y+26-x);
end;

procedure pr(x,y:longint);
var i,v,u:longint;
begin
     v:=52;
     for i:=0 to 25 do
         if c(x,i)+c(y,i)<v then
         begin
              v:=c(x,i)+c(y,i);
              u:=i;
         end;
     write(chr(u+97));
end;

begin
     while true do
     begin
          readln(s);
          if s='[END]' then break;
          if s='[CASE]' then
          begin
               readln(a);
               readln(b);
               for i:=1 to length(a) do pr(ord(a[i])-97,ord(b[i])-97);
               writeln;
          end;
     end;
end.

Code mẫu của happyboy99x

#include<string>
#include<cstdio>
#include<cstring>
using namespace std;

inline void f(char &s, char t) {
    if(s > t) swap(s, t);
    s = t - s < 26 - t + s ? s : 'a';
}

void getEq(char * s, const char * t) {
    const int n = strlen(s);
    for(int i = 0; i < n; ++i) f(s[i], t[i]);
    printf("%s\n", s);
}

char s[51], t[51];

int main() {
    while(scanf("%*s%s%s",s,t) != EOF) getEq(s, t);
    return 0;
}

Code mẫu của ladpro98

program eqstr;
uses    math;
const   fi='';
var     s,t,typ,res:string;
        inp:text;

procedure process;
var     i,x,y:longint;
begin
        res:=s;
        for i:=1 to length(s) do
        begin
                x:=abs(ord(s[i])-ord(t[i]));
                y:= (min(ord(s[i]),ord(t[i])) + ord('z')-max(ord(s[i]),ord(t[i]))-ord('a'));
                if x<y then
                begin
                        res[i]:=chr(min(ord(s[i]),ord(t[i])));
                end
                else
                res[i]:='a';
        end;
end;

begin
        assign(inp,fi);
        reset(inp);
        while not (typ = '[END]') do
        begin

                readln(inp,typ);
                if typ = '[END]' then break;
                readln(inp,s);
                readln(inp,t);
                readln(inp);
                process;
                writeln(res);
        end;

end.

Code mẫu của RR

#include <iostream>
#include <algorithm>
#define FOR(i,a,b) for(int i=a; i<=b; i++)
using namespace std;

int c[30][30],f[30][30];

void init() {
    FOR(i,0,25)
    FOR(j,0,25)
        c[i][j]=1000111;

    FOR(i,0,25) c[i][i]=0;

    FOR(i,0,24) c[i][i+1]=c[i+1][i]=1;
    c[25][0]=c[0][25]=1;

    FOR(k,0,25)
        FOR(i,0,25)
        FOR(j,0,25)
            c[i][j]=min(c[i][j],c[i][k]+c[k][j]);

    FOR(i,0,25)
    FOR(j,0,25) {
        int nn=10000;
        FOR(k,0,25) nn=min(nn,c[i][k]+c[j][k]);

        FOR(k,0,25)
        if (c[i][k]+c[j][k]==nn) {
            f[i][j]=k;
            break;
        }
    }
}

char s[100],a[100],b[100];

int main() {
    init();
    scanf("%s\n",&s);
    while (s[1]=='C') {
        scanf("%s\n",&a);
        scanf("%s\n",&b);
        FOR(i,0,strlen(a)-1)
            printf("%c",'a'+f[(int)a[i]-'a'][(int)b[i]-'a']);
        printf("\n");
        scanf("%s\n",&s);
    }
    return 0;
}

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
#include <string.h>
int main()
{
   // freopen("SNSEQ.inp","r",stdin);
    char s[100],t[100],x[100];
    while(gets(x)>0 )
    {
        if(x[0]!='[')
            continue;
        else if(x[0]=='[' && x[1]=='E')
            break;
        else 
        {
            gets(s);
            gets(t);
            int n = strlen(s);
            for(int i=0;i<n;i++)
            {
                if(s[i]<=t[i] && t[i]-s[i]<13)
                     x[i]=s[i];
                else if(t[i]<s[i] && s[i]-t[i]<13)
                     x[i]=t[i];
                else x[i]='a';
            }
        for(int i=0;i<n;i++)
            printf("%c",x[i]);
        printf("\n");
        }
    }
  //  getch();
}

Code mẫu của ll931110

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
typedef long long ll;
using namespace std;

string getEq(string s,string t)
{
    string ret;
    for (int i = 0; i < s.size(); i++)
    {
        int x1 = s[i] - 'a',x2 = t[i] - 'a';

        int perform = 100,pos = -1;
        for (int i = 0; i < 26; i++)
        {
            int tmp = min(abs(x1 - i),26 - abs(x1 - i)) + min(abs(x2 - i),26 - abs(x2 - i));
            if (perform > tmp)
            {
                perform = tmp;  pos = i;
            };
        };
        char fin = pos + 'a';
        ret += fin;
    };
    return ret;
};

int main()
{
    string a;
    while (1)
    {
          cin >> a;
          if (a == "[END]") break;
          string s,t;
          cin >> s;  cin >> t;
          cout << getEq(s,t) << endl;
    };
};

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.