Submission #596922

# Submission time Handle Problem Language Result Execution time Memory
596922 2022-07-15T09:24:18 Z jy0n Round words (IZhO13_rowords) C++17
100 / 100
239 ms 296 KB
#include <bits/stdc++.h>
using namespace std;
using ull=unsigned long long;

const int Sigma= 26;
string A, B;
vector<ull> d, s[Sigma];

#define set_bit(bs, i) (bs[i>>6] |= 1llu << (i&63))
#define get_bit(bs, i) ((bs[i>>6] >> (i&63))&1)
#define sub(a, b) ((a-b>a)? (a-=b, 1) : (a-=b, 0))

int main() {
    cin >> A >> B;
    int n = (int)A.size(), m = (int)B.size(), l = (m>>6)+1, ans=0;
    d.resize(l);
    for (int i=0; i<Sigma; ++i) s[i].resize(l);
    for (int i=0; i<m; ++i) set_bit(s[B[i]-'a'], i);
    for (int k=0; k<n; ++k) {
        memset(&d[0], 0, sizeof(ull)*l);
        for (int i=0; i<m; ++i) if (A[k] == B[i]) { set_bit(d, i); break; }
        for (int i=1; i<n; ++i) {
            ull sc = 1, mc = 0;
            for (int j=0; j<l; ++j) {
                ull x = s[A[(k+i)%n]-'a'][j]|d[j];
                ull t = (d[j] << 1)|sc;
                sc = d[j] >> 63;
                ull tt = x;
                mc = sub(tt, mc) + sub(tt, t);
                d[j] = x&(x^tt);
            }
        }
        int ret = 0;
        for (int i=0; i<m; ++i) ret += get_bit(d, i);
        ans=max(ans, ret);
    }
    for (int k=0; k<n; ++k) {
        memset(&d[0], 0, sizeof(ull)*l);
        for (int i=0; i<m; ++i) if (A[k] == B[i]) { set_bit(d, i); break; }
        for (int i=n-1; i>0; --i) {
            ull sc = 1, mc = 0;
            for (int j=0; j<l; ++j) {
                ull x = s[A[(k+i)%n]-'a'][j]|d[j];
                ull t = (d[j] << 1)|sc;
                sc = d[j] >> 63;
                ull tt = x;
                mc = sub(tt, mc) + sub(tt, t);
                d[j] = x&(x^tt);
            }
        }
        int ret = 0;
        for (int i=0; i<m; ++i) ret += get_bit(d, i);
        ans=max(ans, ret);
    }
    cout << ans << endl;
}

Compilation message

rowords.cpp: In function 'int main()':
rowords.cpp:11:31: warning: operation on 'tt' may be undefined [-Wsequence-point]
   11 | #define sub(a, b) ((a-b>a)? (a-=b, 1) : (a-=b, 0))
......
   29 |                 mc = sub(tt, mc) + sub(tt, t);
      |                          ~~~~~~
rowords.cpp:29:22: note: in expansion of macro 'sub'
   29 |                 mc = sub(tt, mc) + sub(tt, t);
      |                      ^~~
rowords.cpp:11:31: warning: operation on 'tt' may be undefined [-Wsequence-point]
   11 | #define sub(a, b) ((a-b>a)? (a-=b, 1) : (a-=b, 0))
......
   47 |                 mc = sub(tt, mc) + sub(tt, t);
      |                          ~~~~~~
rowords.cpp:47:22: note: in expansion of macro 'sub'
   47 |                 mc = sub(tt, mc) + sub(tt, t);
      |                      ^~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 18 ms 212 KB Output is correct
7 Correct 105 ms 284 KB Output is correct
8 Correct 96 ms 280 KB Output is correct
9 Correct 98 ms 292 KB Output is correct
10 Correct 97 ms 296 KB Output is correct
11 Correct 123 ms 284 KB Output is correct
12 Correct 180 ms 284 KB Output is correct
13 Correct 143 ms 288 KB Output is correct
14 Correct 132 ms 280 KB Output is correct
15 Correct 173 ms 288 KB Output is correct
16 Correct 120 ms 212 KB Output is correct
17 Correct 132 ms 276 KB Output is correct
18 Correct 195 ms 284 KB Output is correct
19 Correct 100 ms 284 KB Output is correct
20 Correct 152 ms 284 KB Output is correct
21 Correct 84 ms 212 KB Output is correct
22 Correct 97 ms 212 KB Output is correct
23 Correct 138 ms 284 KB Output is correct
24 Correct 149 ms 276 KB Output is correct
25 Correct 239 ms 280 KB Output is correct