11052022-03-03 18:31:54peti1234Blokk eliminációcpp14Elfogadva 50/5041ms12660 KiB
#include <bits/stdc++.h>

using namespace std;
int w, n;
int main()
{
    cin >> w;
    while (w--) {
        string s;
        vector<int> sz;
        cin >> s;
        int cnt=1;
        for (int i=1; i<s.size(); i++) {
            if (s[i]==s[i-1]) cnt++;
            else {
                sz.push_back(cnt>1);
                cnt=1;
            }
        }
        sz.push_back(cnt>1);
        n=sz.size();
        // az sz vektorban vannak a blokkok 1 ha hosszu, 0 ha rovid

        if (n%2) {
            // a paratlan eset, azt kell megnezni, hogy a kozepe jo, vagy nincs legalabb (n-1)/2 hosszu 0 sorozat
            int cnt=0, maxi=0;
            for (auto x:sz) {
                if (!x) {
                    cnt++;
                    maxi=max(maxi, cnt);
                } else cnt=0;
            }
            cout << (sz[(n-1)/2] || 2*maxi+1<n ? "IGEN" : "NEM") << "\n";
        } else {

            // a paros eset: jo helyen kell elvalasztani, ugy hogy mindket reszt kulon-kulon meg lehet oldani
            vector<int> jo(n, 0);
            bool s=0;
            int cnt=0, maxi=0;
            // konnyu a leghosszabb 0 sorozatot szamon tartani
            for (int i=0; i<n; i++) {
                if (!sz[i]) {
                    cnt++;
                    maxi=max(maxi, cnt);
                } else cnt=0;
                if (i%2==0 && (sz[i/2] || 2*maxi<i)) jo[i]=1;
            }
            // jo[i]=0, ha az elso i blokkot meg lehet csinalni (0 indexeles)

            cnt=0, maxi=0;
            for (int i=n-1; i>=1; i--) {
                if (!sz[i]) {
                    cnt++;
                    maxi=max(maxi, cnt);
                } else cnt=0;
                int db=n-1-i;

                // ha ez egy jo elvalsztas, akkor van megoldas
                if (jo[i-1] && (sz[i+db/2] || 2*maxi<db)) s=1;
            }

            // ha nincs jo elvalasztas, akkor nincs megoldas
            cout << (s ? "IGEN" : "NEM") << "\n";
        }
    }
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/02ms1784 KiB
2Elfogadva0/037ms6348 KiB
3Elfogadva2/21ms2828 KiB
4Elfogadva2/21ms2832 KiB
5Elfogadva2/21ms2836 KiB
6Elfogadva2/21ms2840 KiB
7Elfogadva2/21ms2848 KiB
8Elfogadva2/21ms2848 KiB
9Elfogadva2/21ms2856 KiB
10Elfogadva2/21ms2860 KiB
11Elfogadva2/21ms2880 KiB
12Elfogadva2/21ms2900 KiB
13Elfogadva2/21ms2908 KiB
14Elfogadva2/24ms3412 KiB
15Elfogadva3/36ms3524 KiB
16Elfogadva3/34ms3592 KiB
17Elfogadva3/341ms8136 KiB
18Elfogadva3/341ms9020 KiB
19Elfogadva3/341ms9676 KiB
20Elfogadva3/339ms11020 KiB
21Elfogadva4/435ms11968 KiB
22Elfogadva4/441ms12660 KiB