Hướng dẫn giải của Hiệu chỉnh văn bản


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

var n,kq:byte;
    a,b:string;
procedure re;
begin
     readln(n);
     readln(a);
     readln(b);
end;
procedure pr;
var la,i,j,k:byte; kt:boolean; c:string;
begin
     kq:=0;
     repeat
           kt:=false;
           la:=length(a);
           for i:=la downto n do
           begin
                for j:=1 to la-i+1 do
                begin
                     c:=copy(a,j,i);
                     k:=pos(c,b);
                     if k>0 then
                     begin
                          inc(kq);
                          kt:=true;
                          delete(b,k,i);
                          delete(a,j,i);
                     end;
                     if kt then break;
                end;
                if kt then break;
           end;
     until not kt;

end;
procedure wr;
begin
     writeln(kq);
     writeln(a);
     write(b);
end;
begin
     re;
     pr;
     wr;
end.

Code mẫu của happyboy99x

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

char s[51], p[51], t[51];
int k;

int main() {
    scanf("%d%s%s",&k,s,p); int res = 0;
    for(bool stop = false; !stop; ) {
        stop = true;
        for(int l = min(strlen(s), strlen(p)), cont = true; l >= k && cont; --l) {
            for(int n = strlen(s), i = 0; i <= n - l; ++i) {
                strncpy(t, s+i, l); t[l] = 0;
                char * tmp = strstr(p, t);
                if(tmp != NULL) {
                    strcpy(s+i, s+i+l); strcpy(tmp, tmp+l);
                    cont = stop = false; ++res; break;
                }
            }
        }
    }
    printf("%d\n%s\n%s\n", res, s, p);
    return 0;
}

Code mẫu của ladpro98

program nkedit;
uses     math;
const    fi='';
var      a,b:string;
         k,res:longint;

procedure input;
var     f:text;
begin
        assign(f,fi);
        reset(f);
        readln(f,k);
        readln(f,a);
        readln(f,b);
        close(f);
end;

procedure process;
var     i,j,startA,startB,maxL,s,t:longint;
begin
        res:=0;
        repeat
                maxL:=0;
                for i:=1 to length(a) do
                begin
                        for t:=1 to length(b) do
                        begin
                                s:=t;
                                j:=t;
                                while (j<=length(b)) and (i+j-t<=length(a)) and (b[j]=a[i+j-t]) do inc(j);
                                if maxL<(j-s) then
                                begin
                                        maxL:=j-s;
                                        startA:=i;
                                        startB:=s;
                                end;
                        end;
                end;
                if maxL<k then break;
                inc(res);
               delete(a,startA,maxL);
               delete(b,startB,maxL);
        until maxL<k;
end;

begin
        input;
        process;
        writeln(res);
        writeln(a);
        writeln(b);
end.

Code mẫu của RR

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=51;
var
  x,y,count,k:longint;
  s1,s2:string;
  f1,f2:text;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure inp;
begin
  readln(f1,k);
  readln(f1,s1); x:=length(s1);
  readln(f1,s2); y:=length(s2);
end;
procedure ans;
begin
  writeln(f2,count);
  writeln(f2,s1);
  writeln(f2,s2);
end;
function find(var start1,start2:longint):longint;
var
  i,j,ln,l,u,v:longint;
begin
  ln:=-1;
  for u:=1 to x do
  for v:=1 to y do
    begin
      i:=u; j:=v; l:=0;
      while (i<=x) and (j<=y) and (s1[i]=s2[j]) do
        begin
          inc(l);
          inc(i); inc(j);
        end;
      if l>ln then
        begin
          ln:=l;
          start1:=u;
          start2:=v;
        end;
    end;
  find:=ln;
end;
procedure solve;
var
  ln,i,j:longint;
begin
  count:=0;
  ln:=find(i,j);
  while ln>=k do
    begin
      inc(count);
      delete(s1,i,ln);
      delete(s2,j,ln);
      x:=length(s1); y:=length(s2);
      ln:=find(i,j);
    end;
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
//#include <conio.h>

using namespace std;

void FailureFunction(char P[],int F[],int m)
{
     int i,j;
     F[0] = 0;
     j = 0;
     i = 1;
     while(i<m)
     {
         if(P[i] == P[j])
         {
             F[i] = j+1;
             i++;
             j++;
         }
         else if(j>0)
             j = F[j-1];
         else
         {
             F[i] = 0;
             i++;
         }
     }
}

int KMP(int n,char T[],int m, char P[])
{
    int i,j,F[100];
    FailureFunction(P,F,m);
    i = 0;
    j = 0;
    while(i<n)
    {
        if(T[i] == P[j])
        {
            if(j == m-1)
                 return i-j;
            else
            {
                i++;
                j++;
            }
        }
        else if(j>0)
            j = F[j-1];
        else i++;
    }
    return -1;
}

int main()
{
   // freopen("NKEDIT.in","r",stdin);
    int k,n,m,chay=0;
    char s[52],p[52],the[52];
    scanf("%d",&k);
    scanf("%s %s",s,p);
    n = strlen(s); m = strlen(p);
    while(true)
    {
        int flag = 0;
        for(int i = n;i>=k;i--)
        {
            for(int j = 0;j<=n-i;j++)
            {
                for(int k = 0;k<=i-1;k++)
                    the[k] = s[k+j];
                int pos = KMP(m,p,i,the);
                if(pos!=-1)
                {
                    chay++;
                    flag = 1;
                    for(int k = j;k<=n-i-1;k++)
                        s[k] = s[k+i];
                    for(int k = pos;k<=m-i-1;k++)
                       p[k] = p[k+i];
                    n = n-i;
                    m = m-i;
                }
                if( flag ==1)
                    break;
            }
            if(flag == 1)
                break;
        }
        if(flag ==0)
            break;
    }
    printf("%d\n",chay);
    for(int i = 0;i<n;i++)
        printf("%c",s[i]);
    printf("\n");
    for(int i = 0;i<m;i++)
        printf("%c",p[i]);
    //getch();
}

Code mẫu của ll931110

Program NKEDIT;
        Const
                input  = '';
                output = '';
        Var
                    k,count: integer;
                      s1,s2: string;

Procedure init;
          Var

                f: text;
          Begin
                Assign(f, input);
                        Reset(f);

                        Readln(f, k);
                        Readln(f, s1);
                        Readln(f, s2);

                Close(f);
          End;

Procedure solve;
          Var
                i,j,pos1,pos2,num: integer;
                    max,max1,max2: integer;
          Begin
             count:= 0;
             Repeat
                max:= 0;

                For i:= 1 to length(s1) do
                          For j:= 1 to length(s2) do if s1[i] = s2[j] then
                                Begin
                                        pos1:= i;
                                        pos2:= j;
                                        num:= 1;

                                        While (pos1 < length(s1)) and (pos2 < length(s2)) do
                                                Begin
                                                        inc(pos1);
                                                        inc(pos2);

                                                        If s1[pos1] = s2[pos2] then inc(num) else break;
                                                End;

                                        If s1[pos1] <> s2[pos2] then
                                                Begin
                                                        dec(pos1);
                                                        dec(pos2);
                                                End;

                                        If max < num then
                                                Begin
                                                        max:= num;
                                                        max1:= pos1 - max + 1;
                                                        max2:= pos2 - max + 1;
                                                End;
                                End;

                If max < k then break;

                inc(count);
                Delete(s1, max1, max);
                Delete(s2, max2, max);

             Until false;
          End;

Procedure printresult;
          Var
                f: text;
          Begin
                Assign(f, output);
                        Rewrite(f);

                        Writeln(f, count);
                        Writeln(f, s1);
                        Writeln(f, s2);

                Close(f);
          End;

Begin
        init;
        solve;
        printresult;
End.

Code mẫu của skyvn97

program NKEDIT;
uses crt;
var
   s,p:string;
   c,k:integer;
   f:array [1..50,1..50] of integer;
procedure init;
          begin
               readln(k);
               readln(s);
               readln(p);
               c:=0;
          end;
procedure process;
          var
             i,j,max,wi,wj:integer;
          begin
               repeat
                     max:=-1;
                     for i:=1 to length(s) do
                         if s[i]=p[1] then f[i][1]:=1 else f[i][1]:=0;
                     for i:=1 to length(p) do
                         if s[1]=p[i] then f[1][i]:=1 else f[1][i]:=0;
                     for i:=2 to length (s) do
                         for j:=2 to length(p) do
                             if s[i]=p[j] then f[i][j]:=f[i-1][j-1]+1 else f[i][j]:=0;
                     for i:=1 to length(s) do
                         for j:=1 to length(p) do
                             if f[i][j]>max then
                                begin
                                     max:=f[i][j];
                                     wi:=i-max+1;
                                     wj:=j-max+1;
                                end;
                     if max>=k then
                        begin
                             delete(s,wi,max);
                             delete(p,wj,max);
                             inc(c);
                        end;
               until max<k;
          end;
procedure print;
          begin
               writeln(c);
               writeln(s);
               writeln(p);
          end;
begin
     init;
     process;
     print;
     readln;
end.

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.