1. 程式人生 > 實用技巧 >[板子] 線性基

[板子] 線性基

題鏈

講的好的blog

這題讓我發現二進位制運算子對格式的嚴格

比如

if (now & (1LL << j))
if (now & (1LL << j) == 1)

\(now & (1LL << j)\)只可能為1或0的情況下,這兩個程式碼竟然表示的意思不一樣!

還有

(ans ^ a[i]) > ans

記得打括號!

#include <cstdio>

const int N = 60;

int n;
long long now, ans;
long long a[N];
//a陣列為基

int main()
{

    scanf ("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        scanf ("%lld", &now);
        for (int j = N; j >= 0; --j)
            if (now & (1LL << j))
            {
                if (a[j] == 0)
                {
                    a[j] = now;
                    break;
                }
                else
                    now ^= a[j];
            }
    }

    for (int i = N; i >= 0; --i)
        if ((ans ^ a[i]) > ans)
            ans ^= a[i];
    printf ("%lld\n", ans);

    return 0;
}