11052022-03-03 18:31:54peti1234Blokk eliminációcpp14Accepted 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;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/02ms1784 KiB
2Accepted0/037ms6348 KiB
3Accepted2/21ms2828 KiB
4Accepted2/21ms2832 KiB
5Accepted2/21ms2836 KiB
6Accepted2/21ms2840 KiB
7Accepted2/21ms2848 KiB
8Accepted2/21ms2848 KiB
9Accepted2/21ms2856 KiB
10Accepted2/21ms2860 KiB
11Accepted2/21ms2880 KiB
12Accepted2/21ms2900 KiB
13Accepted2/21ms2908 KiB
14Accepted2/24ms3412 KiB
15Accepted3/36ms3524 KiB
16Accepted3/34ms3592 KiB
17Accepted3/341ms8136 KiB
18Accepted3/341ms9020 KiB
19Accepted3/341ms9676 KiB
20Accepted3/339ms11020 KiB
21Accepted4/435ms11968 KiB
22Accepted4/441ms12660 KiB