Submission #1028227

# Submission time Handle Problem Language Result Execution time Memory
1028227 2024-07-19T15:24:54 Z anango Boarding Passes (BOI22_passes) C++17
60 / 100
1444 ms 251372 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int INF = 1LL<<62;

void solve() {

    string S; cin >> S;
    int n = S.size();
    vector<int> ar(n); for (int i=0; i<n; i++) ar[i] = (S[i]-'A');
    int G = *max_element(ar.begin(), ar.end()); G++;
    int pref[n+1][G]; //count of character c, before index i
    int suff[n+1][G]; //count of character c, after or equal to index i
    for (int i=0; i<=n; i++) {
        for (int j=0; j<G; j++) {
            pref[i][j] = suff[i][j] = 0;
        }
    }
    for (int i=0; i<n; i++) {
        for (int j=0; j<=G; j++) {
            if (j==ar[i]) {
                pref[i+1][j] = pref[i][j]+1;
            }
            else {
                pref[i+1][j] = pref[i][j];
            }
        }
    }
    
    for (int i=n-1; i>=0; i--) {
        for (int j=0; j<G; j++) {
            if (j==ar[i]) {
                suff[i][j] = suff[i+1][j]+1;
            }
            else {
                suff[i][j] = suff[i+1][j];
            }
        }
    }
    //everyone before L boards from the front, everyone after or equal to it boards from the back. 
    vector<vector<int>> counts(G,vector<int>(G,0));     //counts[i][j] = sum of subsequences of (i,j) before l, and subsequences of (j,i) after L
    //counts[i][j] = sum of pref[k][j] for k<=L and ar[k]=i, and analogous expression for the suffix
    //first, get initial count values (for everyone boarding from the back)
    //and assuming that these are already boarded since the back breaker may not be the same for each group - that was false assumption
    //so precomp counts then ternary search on the breakpoint
    for (int j=0; j<G; j++) {
        for (int k=0; k<n; k++) {
            int i = ar[k];
            //cout << "adding " << i <<" " << j <<" " << k <<" " << j << " " << suff[k][j] << endl;
            counts[i][j] += suff[k+1][j];
        }
    }
    vector<vector<vector<int>>> acounts;
    acounts.push_back(counts);
    for (int L=0; L<n; L++) {

        //counts[i][j] = number of swaps required if i goes after j



        //transfer L to the right
        int cur = ar[L];
        for (int j=0; j<G; j++) {
            int delta = suff[L+1][j];
            int delta2 = pref[L][j];
            counts[cur][j] -= delta-delta2;
        }
        acounts.push_back(counts);
        
        /*cout << "TRANSFERRED TO " << L+1 << endl;
        for (int i=0; i<G; i++) {
            for (int j=0; j<G; j++) {
                cout << i <<" " << j <<" " << counts[i][j] << endl;
            }
        }
        cout << endl;*/
    }
    vector<int> dp;
    dp=vector<int>(1<<G,INF); //dp[mask] = min cost if this mask is at the beginning of the ordering
    dp[0] = 0;
    for (int mask=0; mask<1<<G; mask++) {
        for (int addon=0; addon<G; addon++) {
            if (mask&(1<<addon)) continue;
            int l = 0; int r = n;
            while (l<r) {
                int m1,m2;
                if (r-l>15) {
                    m1 = l+(r-l)/9;
                    m2 = r-(r-l)/9;
                }
                else {
                    m1 = l;
                    m2 = r;
                }
                int am1 = 0;
                for (int j=0; j<G; j++) {
                    if (mask&(1<<j)) {
                        am1+=2*acounts[m1][addon][j];
                    }
                    if (j==addon) {
                        am1+=acounts[m1][addon][j];
                    }
                }
                int am2 = 0;
                for (int j=0; j<G; j++) {
                    if (mask&(1<<j)) {
                        am2+=2*acounts[m2][addon][j];
                    }
                    if (j==addon) {
                        am2+=acounts[m2][addon][j];
                    }
                }
                //cout << "adding " << mask <<" " << addon <<" " << l <<" " << r <<" " << m1 <<" " << m2 <<" " << am1 <<" " << am2 << endl;
                if (am1>am2) {
                    l=m1+1; r=r;
                }
                else if (am1<am2) {
                    l=l; r=m2-1;
                }
                else {
                    l=m1+1; r=m2;
                }
                //cout << mask <<" " << addon <<" " << al <<endl;
            }
            int al = 0;
            for (int j=0; j<G; j++) {
                if (mask&(1<<j)) {
                    al+=2*acounts[l][addon][j];
                }
                if (j==addon) {
                    al+=acounts[l][addon][j];
                }
            }
            dp[mask | (1<<addon)] = min(dp[mask | (1<<addon)],dp[mask]+al);
        }
    }
    int ans=dp[(1<<G)-1];

    int a2 = ans/2;
    cout << a2;
    if (ans%2==1) cout << ".50";
    cout << endl;
}

signed main() {
    int local=0;
    if (local) {
        // for getting input from input.txt
        freopen("input.txt", "r", stdin);
        // for writing output to output.txt
        freopen("output.txt", "w", stdout);
    }
    /*#ifdef ONLINE_JUDGE
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL);
    #endif*/ //fast IO
    solve();
    
}

Compilation message

passes.cpp: In function 'int main()':
passes.cpp:149:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  149 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
passes.cpp:151:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  151 |         freopen("output.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB found '100800.5000000000', expected '100800.5000000000', error '0.0000000000'
2 Correct 0 ms 348 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
3 Correct 0 ms 348 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
4 Correct 0 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
5 Correct 0 ms 348 KB found '124002.0000000000', expected '124002.0000000000', error '0.0000000000'
6 Correct 10 ms 11084 KB found '772893586.0000000000', expected '772893586.0000000000', error '0.0000000000'
7 Correct 12 ms 10760 KB found '1100977812.5000000000', expected '1100977812.5000000000', error '0.0000000000'
8 Correct 21 ms 11540 KB found '1249950000.5000000000', expected '1249950000.5000000000', error '0.0000000000'
9 Correct 12 ms 11784 KB found '1249975000.0000000000', expected '1249975000.0000000000', error '0.0000000000'
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
2 Correct 0 ms 348 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
3 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
4 Correct 0 ms 348 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
5 Correct 1 ms 348 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
6 Correct 0 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
7 Correct 0 ms 348 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
8 Correct 1 ms 348 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
9 Correct 1 ms 344 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
10 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
11 Correct 0 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
12 Correct 0 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
13 Correct 0 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
14 Correct 1 ms 344 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
15 Correct 0 ms 348 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
16 Correct 0 ms 348 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
17 Correct 1 ms 344 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
2 Correct 0 ms 348 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
3 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
4 Correct 0 ms 348 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
5 Correct 1 ms 348 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
6 Correct 0 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
7 Correct 0 ms 348 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
8 Correct 1 ms 348 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
9 Correct 1 ms 344 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
10 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
11 Correct 0 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
12 Correct 0 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
13 Correct 0 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
14 Correct 1 ms 344 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
15 Correct 0 ms 348 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
16 Correct 0 ms 348 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
17 Correct 1 ms 344 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
18 Correct 0 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
19 Correct 0 ms 348 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
20 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
21 Correct 0 ms 432 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
22 Correct 1 ms 344 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
23 Correct 0 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
24 Correct 1 ms 344 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
25 Correct 0 ms 348 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
26 Correct 1 ms 348 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
27 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
28 Correct 0 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
29 Correct 1 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
30 Correct 1 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
31 Correct 1 ms 348 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
32 Correct 0 ms 436 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
33 Correct 1 ms 348 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
34 Correct 0 ms 348 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
35 Correct 8 ms 10136 KB found '12497500.0000000000', expected '12497500.0000000000', error '0.0000000000'
36 Correct 8 ms 10292 KB found '12495000.5000000000', expected '12495000.5000000000', error '0.0000000000'
37 Correct 21 ms 14260 KB found '12223392.0000000000', expected '12223392.0000000000', error '0.0000000000'
38 Correct 15 ms 14256 KB found '2372500.0000000000', expected '2372500.0000000000', error '0.0000000000'
39 Correct 15 ms 14232 KB found '12475017.5000000000', expected '12475017.5000000000', error '0.0000000000'
40 Correct 16 ms 14200 KB found '10655706.0000000000', expected '10655706.0000000000', error '0.0000000000'
41 Correct 19 ms 13976 KB found '11977895.5000000000', expected '11977895.5000000000', error '0.0000000000'
42 Correct 19 ms 13976 KB found '11977865.0000000000', expected '11977865.0000000000', error '0.0000000000'
43 Correct 18 ms 13720 KB found '11977907.5000000000', expected '11977907.5000000000', error '0.0000000000'
44 Correct 18 ms 13720 KB found '11977808.0000000000', expected '11977808.0000000000', error '0.0000000000'
45 Correct 18 ms 13976 KB found '11977791.0000000000', expected '11977791.0000000000', error '0.0000000000'
46 Correct 20 ms 13720 KB found '11977871.5000000000', expected '11977871.5000000000', error '0.0000000000'
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB found '100800.5000000000', expected '100800.5000000000', error '0.0000000000'
2 Correct 0 ms 348 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
3 Correct 0 ms 348 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
4 Correct 0 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
5 Correct 0 ms 348 KB found '124002.0000000000', expected '124002.0000000000', error '0.0000000000'
6 Correct 10 ms 11084 KB found '772893586.0000000000', expected '772893586.0000000000', error '0.0000000000'
7 Correct 12 ms 10760 KB found '1100977812.5000000000', expected '1100977812.5000000000', error '0.0000000000'
8 Correct 21 ms 11540 KB found '1249950000.5000000000', expected '1249950000.5000000000', error '0.0000000000'
9 Correct 12 ms 11784 KB found '1249975000.0000000000', expected '1249975000.0000000000', error '0.0000000000'
10 Correct 1 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
11 Correct 0 ms 348 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
12 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
13 Correct 0 ms 348 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
14 Correct 1 ms 348 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
15 Correct 0 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
16 Correct 0 ms 348 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
17 Correct 1 ms 348 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
18 Correct 1 ms 344 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
19 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
20 Correct 0 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
21 Correct 0 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
22 Correct 0 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
23 Correct 1 ms 344 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
24 Correct 0 ms 348 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
25 Correct 0 ms 348 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
26 Correct 1 ms 344 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
27 Correct 0 ms 348 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
28 Correct 0 ms 348 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
29 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
30 Correct 0 ms 432 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
31 Correct 1 ms 344 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
32 Correct 0 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
33 Correct 1 ms 344 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
34 Correct 0 ms 348 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
35 Correct 1 ms 348 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
36 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
37 Correct 0 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
38 Correct 1 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
39 Correct 1 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
40 Correct 1 ms 348 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
41 Correct 0 ms 436 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
42 Correct 1 ms 348 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
43 Correct 0 ms 348 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
44 Correct 8 ms 10136 KB found '12497500.0000000000', expected '12497500.0000000000', error '0.0000000000'
45 Correct 8 ms 10292 KB found '12495000.5000000000', expected '12495000.5000000000', error '0.0000000000'
46 Correct 21 ms 14260 KB found '12223392.0000000000', expected '12223392.0000000000', error '0.0000000000'
47 Correct 15 ms 14256 KB found '2372500.0000000000', expected '2372500.0000000000', error '0.0000000000'
48 Correct 15 ms 14232 KB found '12475017.5000000000', expected '12475017.5000000000', error '0.0000000000'
49 Correct 16 ms 14200 KB found '10655706.0000000000', expected '10655706.0000000000', error '0.0000000000'
50 Correct 19 ms 13976 KB found '11977895.5000000000', expected '11977895.5000000000', error '0.0000000000'
51 Correct 19 ms 13976 KB found '11977865.0000000000', expected '11977865.0000000000', error '0.0000000000'
52 Correct 18 ms 13720 KB found '11977907.5000000000', expected '11977907.5000000000', error '0.0000000000'
53 Correct 18 ms 13720 KB found '11977808.0000000000', expected '11977808.0000000000', error '0.0000000000'
54 Correct 18 ms 13976 KB found '11977791.0000000000', expected '11977791.0000000000', error '0.0000000000'
55 Correct 20 ms 13720 KB found '11977871.5000000000', expected '11977871.5000000000', error '0.0000000000'
56 Correct 128 ms 604 KB found '7.5000000000', expected '7.5000000000', error '0.0000000000'
57 Correct 174 ms 764 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
58 Correct 0 ms 348 KB found '100800.5000000000', expected '100800.5000000000', error '0.0000000000'
59 Correct 0 ms 348 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
60 Correct 0 ms 344 KB found '0.0000000000', expected '0.0000000000', error '-0.0000000000'
61 Correct 1 ms 344 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
62 Correct 0 ms 348 KB found '124002.0000000000', expected '124002.0000000000', error '0.0000000000'
63 Correct 12 ms 10768 KB found '772893586.0000000000', expected '772893586.0000000000', error '0.0000000000'
64 Correct 14 ms 10760 KB found '1100977812.5000000000', expected '1100977812.5000000000', error '0.0000000000'
65 Correct 14 ms 11788 KB found '1249950000.5000000000', expected '1249950000.5000000000', error '0.0000000000'
66 Correct 14 ms 11580 KB found '1249975000.0000000000', expected '1249975000.0000000000', error '0.0000000000'
67 Correct 0 ms 344 KB found '1.0000000000', expected '1.0000000000', error '0.0000000000'
68 Correct 1 ms 344 KB found '1225.0000000000', expected '1225.0000000000', error '0.0000000000'
69 Correct 1 ms 348 KB found '1023.0000000000', expected '1023.0000000000', error '0.0000000000'
70 Correct 1 ms 348 KB found '294.0000000000', expected '294.0000000000', error '0.0000000000'
71 Correct 0 ms 348 KB found '1087.0000000000', expected '1087.0000000000', error '0.0000000000'
72 Correct 1 ms 348 KB found '1.5000000000', expected '1.5000000000', error '0.0000000000'
73 Correct 1 ms 344 KB found '703.0000000000', expected '703.0000000000', error '0.0000000000'
74 Correct 1 ms 344 KB found '55.5000000000', expected '55.5000000000', error '0.0000000000'
75 Correct 0 ms 348 KB found '56.0000000000', expected '56.0000000000', error '0.0000000000'
76 Correct 1 ms 348 KB found '45.0000000000', expected '45.0000000000', error '0.0000000000'
77 Correct 1 ms 348 KB found '66.5000000000', expected '66.5000000000', error '0.0000000000'
78 Correct 0 ms 348 KB found '67.0000000000', expected '67.0000000000', error '0.0000000000'
79 Correct 1 ms 348 KB found '66.0000000000', expected '66.0000000000', error '0.0000000000'
80 Correct 0 ms 348 KB found '47.0000000000', expected '47.0000000000', error '0.0000000000'
81 Correct 1 ms 348 KB found '50.0000000000', expected '50.0000000000', error '0.0000000000'
82 Correct 1 ms 344 KB found '49.0000000000', expected '49.0000000000', error '0.0000000000'
83 Correct 0 ms 348 KB found '57.0000000000', expected '57.0000000000', error '0.0000000000'
84 Correct 8 ms 10256 KB found '12497500.0000000000', expected '12497500.0000000000', error '0.0000000000'
85 Correct 8 ms 10132 KB found '12495000.5000000000', expected '12495000.5000000000', error '0.0000000000'
86 Correct 20 ms 14116 KB found '12223392.0000000000', expected '12223392.0000000000', error '0.0000000000'
87 Correct 14 ms 14164 KB found '2372500.0000000000', expected '2372500.0000000000', error '0.0000000000'
88 Correct 14 ms 14264 KB found '12475017.5000000000', expected '12475017.5000000000', error '0.0000000000'
89 Correct 15 ms 13976 KB found '10655706.0000000000', expected '10655706.0000000000', error '0.0000000000'
90 Correct 18 ms 13840 KB found '11977895.5000000000', expected '11977895.5000000000', error '0.0000000000'
91 Correct 19 ms 13976 KB found '11977865.0000000000', expected '11977865.0000000000', error '0.0000000000'
92 Correct 17 ms 13976 KB found '11977907.5000000000', expected '11977907.5000000000', error '0.0000000000'
93 Correct 19 ms 13968 KB found '11977808.0000000000', expected '11977808.0000000000', error '0.0000000000'
94 Correct 20 ms 13972 KB found '11977791.0000000000', expected '11977791.0000000000', error '0.0000000000'
95 Correct 18 ms 13972 KB found '11977871.5000000000', expected '11977871.5000000000', error '0.0000000000'
96 Incorrect 1444 ms 251372 KB 1st numbers differ - expected: '1239972790.0000000000', found: '1239972795.0000000000', error = '0.0000000040'
97 Halted 0 ms 0 KB -