Hướng dẫn giải của Chuỗi hạt


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

const fi='nknl.inp';
      fo='nknl.out';
var re,n:longint;
    s,a:array[0..250] of char;

procedure rf;
begin
     n:=0;
     while not eoln do
     begin
          inc(n);
          read(s[n]);
     end;
end;

procedure pr;
var i,x,y,p,q,nt:longint; kt:boolean;
begin
     re:=0;
     for p:=1 to n-4 do
     begin
          fillchar(a,sizeof(a),'0');
          for i:=p to p+3 do
              a[i-p]:=s[i];
          for q:=p+4 to n do
          begin
               a[q-p]:=s[q];
               nt:=q-p+1;
               x:=0; y:=1; kt:=true;
               while (x<nt) and (y<nt) and (x<y) and kt do
               begin
                    i:=0;
                    repeat
                          if a[(x+i) mod nt]<a[(y+i) mod nt] then
                          begin
                               y:=(y+i) mod nt + 1;
                               break;
                          end
                          else
                          begin
                               if a[(x+i) mod nt]>a[(y+i) mod nt] then
                               begin
                                    kt:=false;
                                    break;
                               end
                               else inc(i);
                          end;
                    until i=nt;
                    if i=nt then break;
               end;
               if kt then inc(re);
          end;
     end;
end;

procedure wf;
begin
     write(re);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của RR

{$MODE OBJFPC}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       250;

var
  f1,f2         :       text;
  f             :       array[1..MAXN,1..MAXN,1..MAXN] of integer;
  s             :       string;
  n             :       longint;

procedure openF;
    begin
      assign(f1,FINP); reset(f1);
      assign(f2,FOUT); rewrite(f2);
    end;

procedure closeF;
    begin
      close(f1);
      close(f2);
    end;

procedure inp;
    var
      k,i,j:longint;
    begin
      readln(f1,s); n:=length(s);

      for i:=1 to n-1 do
      for j:=i+1 to n do
        if s[i]>s[j] then f[1,i,j]:=1
        else if s[i]=s[j] then f[1,i,j]:=0
        else f[1,i,j]:=-1;

      for k:=2 to n-1 do
      for i:=1 to n-k do
      for j:=i+1 to n-k+1 do
        if f[k-1,i,j]<>0 then f[k,i,j]:=f[k-1,i,j]
        else
          if s[i+k-1]>s[j+k-1] then f[k,i,j]:=1
          else if s[i+k-1]=s[j+k-1] then f[k,i,j]:=0
          else f[k,i,j]:=-1;
    end;

function check(i,j:longint):boolean;
    var
      u,v,k:longint;
    begin
      u:=j-i+1; v:=0;
      for k:=i+1 to j do
        begin
          dec(u); inc(v);
          if (f[u,i,k]=1) then exit(false);
          if (f[u,i,k]=0) and (f[v,i,j-v+1]=-1) then exit(false);
        end;
      exit(true);
    end;

procedure solve;
    var
      i,j,res:longint;
    begin
      res:=0;
      for i:=1 to n-4 do
      for j:=i+4 to n do
        if check(i,j) then
            inc(res);
      writeln(f2,res);
    end;

begin
  openF;
  inp;
  solve;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
#include <string.h>
#define maxn 251

char s[maxn];
int f[maxn][maxn];

int main()
{
    //freopen("NKNL.in","r",stdin);
    scanf("%s",s);
    int n = strlen(s);
    for(int i = 0;i<=n-1;i++)
    {
        if(s[i] != s[n-1])
        {
            f[i][n-1] = 0;
            f[n-1][i] = 0;
        }
        else
        {
            f[i][n-1] = n;
            f[n-1][i] = n;
        }
    }
    for(int i = n-2;i>=0;i--)
    {
        for(int j = 0;j<=i;j++)
        {
            if(s[i]!=s[j])
            {
                f[i][j] = 0;
                f[j][i] = 0;
            }
            else
            {
                f[i][j] = f[i+1][j+1]+1;
                f[j][i] = f[i][j];
            }
        }
    }
    int KQ = 0;
    for(int i = 5;i<=n;i++)
        for(int u = 0;u<=n-i;u++)
        {
             int flag = 0;
             for(int j = 1;j<=i-1;j++)
             {
                  if(f[u][u+j]+j<=i-1)
                  {
                      if(s[u+j+f[u][u+j]]<s[u+f[u][u+j]])
                      {
                          flag = 1;
                          break;
                      }
                  }
                  else if(f[u][u+i-j]+u+i-j<=u+i-1)
                  {
                       if(s[f[u][u+i-j]+u+i-j]>s[u+f[u][u+i-j]])
                       {
                           flag = 1;
                           break;
                       }
                  }
             }
             if(flag == 0)
             {
                 KQ++;
             }
        }
    printf("%d",KQ);
   // getch();
}

Code mẫu của khuc_tuan

#include <stdio.h>
#include <string.h>

char a[255];
int n;
int F[255][255];

int main() {
    gets(a);
    n = strlen(a);
    for(int i=n-1;i>=0;--i)
        for(int j=n-1;j>=i;--j) {
            if(a[i]!=a[j]) F[i][j] = 0;
            else if(i==n-1 || j==n-1) F[i][j] = 1;
            else F[i][j] = F[i+1][j+1] + 1;
        }
    int dem = 0;
    for(int st=0;st<n;++st) for(int en=st;en<n;++en) if(en-st+1 >= 5) {
        bool ok = true;
        for(int i=st+1;i<=en;++i) {
            // compare a[st->en]  |   a[i->en + st -> (i-1)] 
            int z = F[st][i];
            if(z<en-i+1 && a[st+z] > a[i+z]) { ok = false; break; }
            else if(z>=en-i+1) {
                z = F[st][st+en-i+1];
                if(z<i-st && a[st+z] < a[st+en-i+1+z]) { ok = false; break; }
            }
        }
        if(ok) ++dem;
    }
    printf("%d\n", dem);
    return 0;
}

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.