Hướng dẫn giải của Counting K-Rectangle


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 ladpro98

#include <iostream>
#include <cstdio>
#include <vector>
#define REP(i, a, b) for(int i = (a); i <=(b); ++i)

const int N = 110;

using namespace std;

int n, m, k;
int a[N][N], mask[N];
vector<bool> ok (1 << 26);
char s[N];

void backtrack(int i, int now, int cntNow) {
    if (cntNow == k) {
        ok[now] = 1;
        return;
    }
    backtrack(i + 1, now | (1 << i), cntNow + 1);
    if (cntNow + 25 - i >= k)
        backtrack(i + 1, now, cntNow);
}

int main() {
    #ifdef _LAD_
        freopen("KRECT.inp", "r", stdin);
    #endif // _LAD_
    scanf("%d %d %d\n", &m, &n , &k);
    REP(i, 1, m) {
        scanf("%s\n", s + 1);
        REP(j, 1, n)
            a[i][j] = s[j] - 'A';
    }
    backtrack(0, 0, 0);
    int rect = 0, ans = 0;
    REP(i, 1, m) {
        REP(j, 1, n) mask[j] = 0;
        REP(j, i, m) {
            REP(col, 1, n)
                mask[col] |= 1 << a[j][col];
            REP(l, 1, n) {
                rect = 0;
                REP(r, l, n) {
                    rect |= mask[r];
                    ans += ok[rect];
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}

Code mẫu của RR

{$MODE OBJFPC}

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

var
  f1,f2         :       text;
  m,n,k         :       longint;
  a             :       array[1..MAXN,1..MAXN] of char;
  count         :       array[1..MAXN,'A'..'Z'] of 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
      i,j:longint;
    begin
      readln(f1,m,n,k);
      for i:=1 to m do
        begin
          for j:=1 to n do read(f1,a[i,j]);
          readln(f1);
        end;
    end;

var
  now:longint;
  all:array['A'..'Z'] of longint;

procedure add(i:longint); inline;
    var
      c:char;
    begin
      for c:='A' to 'Z' do
      if count[i,c]>0 then
        begin
          if all[c]=0 then inc(now);
          inc(all[c],count[i,c]);
        end;
    end;

procedure del(i:longint); inline;
    var
      c:char;
    begin
      for c:='A' to 'Z' do
      if count[i,c]>0 then
        begin
          dec(all[c],count[i,c]);
          if all[c]=0 then dec(now);
        end;
    end;

function get(x:longint):longint; inline;
    var
      l,r,i,j,res:longint;
    begin
      res:=0;
      for l:=1 to m do
        begin
          fillchar(count,sizeof(count),0);
          for r:=l to m do
            begin
              for i:=1 to n do
                inc(count[i,a[r,i]]);
              fillchar(all,sizeof(all),0);
              now:=0;
              j:=1;
              for i:=1 to n do
                begin
                  add(i);
                  while now>x do
                    begin
                      del(j);
                      inc(j);
                    end;
                  inc(res,i-j+1);
                end;
            end;
        end;
      exit(res);
    end;

begin
  openF;
  inp;
  writeln(f2,get(k)-get(k-1));
  closeF;
end.

Code mẫu của hieult

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.2
#define maxn 1502
#define oo 1111111111
#define base 100000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
double const PI=4*atan(1);

using namespace std;

typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;

char s[102];
int f[30][102][102],t[30],so;
int n,m,k;

int xuly(int k){
     int KQ = 0;
    int u,v;
     for(int i = 1;i<=m;i++)
          for(int j=i;j<=m;j++){
                v = 0; memset(t,0,sizeof(t));
                for(u = 1 ;u<=n;u++){
                      for(int x = 0;x<='Z'-'A';x++)
                            t[x]-=(f[x][u-1][j]-f[x][u-1][i-1]);
                      while(v<n+1){
                            so = 0;       
                            for(int x = 0;x<='Z'-'A';x++) if(t[x]) so++;
                            if(so>=k)
                                 break;
                            v++;
                            for(int x = 0;x<='Z'-'A';x++)
                                 t[x]+=(f[x][v][j]-f[x][v][i-1]);                           
                      }
                      if(v>n) break;
                      else KQ+=n-v+1;
                }
          //if(k==4) printf("%d %d %d\n",i,j,KQ);       
          }
     return KQ;    
}

int main(){
    // freopen("KRECT.in","r",stdin);    
     scanf("%d %d %d",&n,&m,&k);
     memset(f,0,sizeof(f));
     for(int i = 1;i<=n;i++){
          scanf("%s",s);
          for(int j = 1;j<=m;j++)
               for(int k = 0;k<='Z'-'A';k++){
                     if(k+'A'==s[j-1])
                          f[k][i][j] = f[k][i][j-1]+1;
                     else f[k][i][j] = f[k][i][j-1];
               }
     }
    // printf("%d %d\n",xuly(k),xuly(k+1));
     printf("%d",xuly(k)-xuly(k+1));
    // getch();
}

Code mẫu của khuc_tuan

//{$APPTYPE CONSOLE}
 {$MODE DELPHI}

var
    z : array[1..100,0..25] of integer;
    d, e : array[0..25] of integer;
    m, n, k : integer;
    a : array[1..100,1..100] of char;

function get() : integer;
var
    r, i, j, j2, d1, d2, kk, kk2, t: integer;
begin
    r := 0;
    for d1:=1 to m do
    begin
        fillchar( z, sizeof(z), 0);
        for d2:=d1 to m do
        begin
            for i:=1 to n do
                inc( z[i, ord(a[d2,i]) - ord('A')] );
            kk := 0;
            kk2 := 0;
            j := 0;
            j2 := 0;
            fillchar( d, sizeof(d), 0);
            fillchar( e, sizeof(e), 0);
            for i:=1 to n do
            begin
                while (kk <= k) and (j<=n) do
                begin
                    inc(j);
                    if j>n then break;
                    for t:=0 to 25 do
                    begin
                        if (d[t]=0) and (z[j,t]>0) then inc(kk);
                        d[t] := d[t] + z[j,t];
                    end;
                end;

                while (kk2 < k) and (j2 <=n) do
                begin
                    inc(j2);
                    if j2 > n then break;
                    for t:=0 to 25 do
                    begin
                        if (e[t]=0) and (z[j2,t]>0) then inc(kk2);
                        e[t] := e[t] + z[j2,t];
                    end;
                end;

                r := r + j - j2;

                for t:=0 to 25 do
                begin
                    if (d[t]>0) and (d[t]=z[i,t]) then dec(kk);
                    d[t] := d[t] - z[i,t];

                    if (e[t]>0) and (e[t]=z[i,t]) then dec(kk2);
                    e[t] := e[t] - z[i,t];
                end;
            end;
        end;
    end;
    get := r;
end;

var
    i, j : integer;

begin
    readln(m, n, k);
    for i:=1 to m do
    begin
        for j:=1 to n do read(a[i,j]);
        readln;
    end;
    writeln( get());
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.