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.
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