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