Submission #596911

# Submission time Handle Problem Language Result Execution time Memory
596911 2022-07-15T09:16:28 Z jy0n Round words (IZhO13_rowords) C++17
84 / 100
210 ms 300 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=m-1; i>=0; --i) if (A[k] == B[i]) { set_bit(d, m-1-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=m-1; i>=0; --i) ret += get_bit(d, m-1-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:39:70: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
   39 |         for (int i=m-1; i>=0; --i) if (A[k] == B[i]) { set_bit(d, m-1-i); break; }
      |                                                                   ~~~^~
rowords.cpp:9:28: note: in definition of macro 'set_bit'
    9 | #define set_bit(bs, i) (bs[i>>6] |= 1llu << (i&63))
      |                            ^
rowords.cpp:39:70: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   39 |         for (int i=m-1; i>=0; --i) if (A[k] == B[i]) { set_bit(d, m-1-i); break; }
      |                                                                   ~~~^~
rowords.cpp:9:46: note: in definition of macro 'set_bit'
    9 | #define set_bit(bs, i) (bs[i>>6] |= 1llu << (i&63))
      |                                              ^
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);
      |                      ^~~
rowords.cpp:52:57: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
   52 |         for (int i=m-1; i>=0; --i) ret += get_bit(d, m-1-i);
      |                                                      ~~~^~
rowords.cpp:10:29: note: in definition of macro 'get_bit'
   10 | #define get_bit(bs, i) ((bs[i>>6] >> (i&63))&1)
      |                             ^
rowords.cpp:52:57: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   52 |         for (int i=m-1; i>=0; --i) ret += get_bit(d, m-1-i);
      |                                                      ~~~^~
rowords.cpp:10:39: note: in definition of macro 'get_bit'
   10 | #define get_bit(bs, i) ((bs[i>>6] >> (i&63))&1)
      |                                       ^
# 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 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 27 ms 300 KB Output is correct
7 Correct 112 ms 212 KB Output is correct
8 Incorrect 112 ms 284 KB Output isn't correct
9 Correct 115 ms 288 KB Output is correct
10 Correct 117 ms 280 KB Output is correct
11 Correct 134 ms 284 KB Output is correct
12 Correct 157 ms 212 KB Output is correct
13 Correct 193 ms 280 KB Output is correct
14 Correct 145 ms 280 KB Output is correct
15 Correct 182 ms 284 KB Output is correct
16 Correct 139 ms 212 KB Output is correct
17 Incorrect 149 ms 284 KB Output isn't correct
18 Correct 209 ms 284 KB Output is correct
19 Correct 109 ms 280 KB Output is correct
20 Incorrect 160 ms 284 KB Output isn't correct
21 Correct 63 ms 280 KB Output is correct
22 Correct 95 ms 212 KB Output is correct
23 Correct 136 ms 212 KB Output is correct
24 Correct 144 ms 212 KB Output is correct
25 Incorrect 210 ms 284 KB Output isn't correct