1 条题解

  • 0
    @ 2026-5-18 22:30:06

    思路

    我们先考虑 0101 串的其中一位。

    首先,如果两个 0101 串的第 xx 位一样,答案也一样,那么可以将这两个 0101 串删掉(打上标记代表两个已经被删去),因为可以通过 if (b[x] == 共同的位) return 共同的答案;来解决。

    我们重复循环。如果一次循环什么东西都没删,而且还没删完,就直接返回 LIE。因为接下来无论如何循环结果都不会改变。

    如果删完了,返回 OK

    代码

    AC

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<map>
    #include<algorithm>
    
    using namespace std;
    
    // 快读
    inline int read()
    {
    	int x = 0,f = 1;char ch = getchar();
    	while (ch < '0' or ch > '9'){if (ch == '-') f = -1;ch = getchar();}
    	while (ch >= '0' and ch<='9'){x = x * 10 + ch - 48;ch = getchar();}
    	return x * f;
    }
    string check() {
    	int a = read(),b = read(),d[105];
    	string c[105];
    	bool e[105];
    	for(int i = 1;i <= b;i++) {
    		cin>>c[i];
    		d[i] = read(),e[i] = 1;
    	}
    	int m = b;
    	while(m) {
    		bool s = 1;
    		for(int i = 0;i < a;i++) {
    			bool k[4] = {0,0,0,0};
    			for(int j = 1;j <=  b;j++) {
    				if(e[j]) {
    					if(c[j][i] == '0' and d[j] == 0) k[0] = 1;
    					else if(c[j][i] == '0' and d[j] == 1) k[1] = 1;
    					else if(c[j][i] == '1' and d[j] == 0) k[2] = 1;
    					else k[3] = 1;
    				}
    			}
    			if(k[0] xor k[1]) {
    				for(int j = 1;j <= b;j++) {
    					if(c[j][i] == '0' and e[j]) e[j] = 0,m--;
    				}
    				s = 0;
    			}
    			if(k[2] xor k[3]) {
    				for(int j = 1;j <= b;j++) {
    					if(c[j][i] == '1' and e[j]) e[j] = 0,m--;
    				}
    				s = 0;
    			}
    			if(!m) 	return "OK\n";
    		}
    		if(s) return "LIE\n";
    	}
    	
    }
    int main() {
    	int t = read();
    	while(t--) {
    		cout<< check();
    	} 
        return 0;
    }
    
    
    • 1

    信息

    ID
    6972
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    13
    已通过
    5
    上传者