P2447 [SDOI2010] Außerirdischer Tausendfüßler (XOR-Gaußsche Eliminierung + Bitset-Anwendung)

Nun stehen vor Ihnen N Tausendfüßler mit den Nummern 1...N. Ihre Aufgabe besteht darin, den Planeten zu identifizieren, zu dem jedes Insekt gehört, aber Sie dürfen ihre Füße nicht selbst zählen.

Charles wählt mehrere dieser N Tausendfüßler aus und legt sie in den „Insect Feet Counter“ (Insektenfußzähler, IFC), und der „Insect Feet Counter“ zählt automatisch die Summe aller darin enthaltenen Insektenfüße. Charles wird Ihnen das Ergebnis dieser Summe \bmodmod 22 zurückgeben und Ihnen sagen, welche Fehler überhaupt in die Maschine eingefügt wurden.

Insgesamt M

Wenn die vorhandenen Daten nach Ablauf der K-Zählung ausreichen, um die Identität jedes Fehlers zu bestimmen, sollten Sie diese KK auch an Charles zurückgeben. Wenn K<M zu diesem Zeitpunkt ist, bedeutet dies, dass die nachfolgenden MK-Zählungen nicht erforderlich sind.

Wenn die Identität jedes Fehlers nicht anhand aller M-Statistiken ermittelt werden kann, sollten Sie Charles erklären, dass es für die aktuellen Daten mehrere Lösungen gibt.

Eingabeformat

Die erste Zeile besteht aus zwei positiven ganzen Zahlen N,M.

In den nächsten M Zeilen werden die statistischen Ergebnisse der M-maligen Nutzung der „Fußklickmaschine“ durch Charles der Reihe nach aufgeführt. Jede Zeile enthält eine 0101-Zeichenfolge und eine Zahl, getrennt durch ein Leerzeichen. Die Zeichenfolge 0101 gibt an, ob jeder Fehler in der Bitreihenfolge in die Maschine eingefügt wird: Wenn das i-te Zeichen 0 ist, bedeutet dies, dass der Fehler mit der Nummer i nicht eingefügt wurde, und 11 bedeutet, dass er eingefügt wurde. Die folgenden Zahlen sind das Ergebnis der Zählung der Anzahl der Insekten Mod 22.

Da die experimentellen Maschinen der NASA genau sind, ist gewährleistet, dass sich die Daten davor und danach nicht widersprechen. Das heißt, die gegebenen Daten müssen eine Lösung haben.

Ausgabeformat

Wenn es eine eindeutige Lösung für die gegebenen Daten gibt, gibt es N+1 Zeilen. Die erste Zeile gibt eine positive ganze Zahl K aus, die M nicht überschreitet, was darauf hinweist, dass die eindeutige Lösung nach der K-Statistik bestimmt werden kann; die nächsten N Zeilen beantworten jeden Tausendfüßler wiederum Die Identität des Wurms: Wenn er eine ungerade Anzahl von Fuß hat, wird er ausgegeben  ?y7M#(Marstext), und wenn er eine gerade Anzahl von Fuß hat, wird er ausgegeben  Earth.

Ausgabe, wenn es mehrere Lösungen für die Eingabedaten gibt  Cannot Determine.

Eingabe- und Ausgabebeispiele

M-mal, und Sie sollten so schnell wie möglich Identifizierungsergebnisse erhalten.

Grammatik:

bitset<(int)> s;

Bitset ist ein Gerät mit der Zeichenfolge 01 als Speicher;

bitset<10> s;

Zeigt 0000000000 an;

size(s) gibt die Größe von s an; sizeof gibt an, dass 4 Zeichen eine Einheit sind, wenn s vom Typ int ist; s.count() gibt an, wie viele Einsen in s sind;

Es kann wie ein Array s[0] = 1 sein, oder Sie können die Funktionsbibliothek s.set(0); s.reset() verwenden, um alle Zahlen, die 1 werden, in 0 zu ändern;

s.flip() soll 1 in 0 und 0 in 1 umwandeln; s.test((int)) soll testen, wie viele Ziffern zurückgegeben werden;

bitset<11> s(111) 111 ist hier dezimal und wird automatisch in eine binäre Darstellung konvertiert;

bitset<11> s("111") unverändert;

Antwort:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
#include<bitset>
using namespace std;
typedef long long lt;
typedef double dd;

int read() //快读
{
    int f = 1, x = 0;
    char ss = getchar();
    while (ss < '0' || ss>'9') { if (ss == '-')f = -1; ss = getchar(); }
    while (ss >= '0' && ss <= '9') { x = x * 10 + ss - '0'; ss = getchar(); }
    return f * x;
}

const int maxn = 1010;
int n, m;
bitset<maxn> a[maxn << 1];
char ss[maxn]; //这里开字符数组 用string会报错

int gaosi()
{
    int res = 0;
    for (int i = 1; i <= n; ++i)
    {
        int r = i;
        while (!a[r][i] && r <= m) r++;
        if (r == m + 1) return 0;//此时要么无解要么无穷多解

        res = max(res, r); //最大的那次操作 后面的就没有必要了
        if (r != i) swap(a[r], a[i]);

        for (int j = 1; j <= m; ++j)
            if (i != j && a[j][i]) a[j] ^= a[i]; // 异或
    }
    return res;
}

int main()
{
    n = read(); m = read();
    for (int i = 1; i <= m; ++i)
    {
        scanf("%s", ss); a[i][n + 1] = read();
        for (int j = 0; j < n; ++j)
            a[i][j + 1] = ss[j] - '0';
    }

    int ans = gaosi();
    if (ans == 0) printf("Cannot Determine");
    else {
        printf("%d\n", ans);
        for (int i = 1; i <= n; ++i)
            if (a[i][n + 1]) printf("?y7M#\n");
            else printf("Earth\n");
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/129476018
Recomendado
Clasificación