1 条题解
-
0
思路
我们先考虑 串的其中一位。
首先,如果两个 串的第 位一样,答案也一样,那么可以将这两个 串删掉(打上标记代表两个已经被删去),因为可以通过
if (b[x] == 共同的位) return 共同的答案;来解决。我们重复循环。如果一次循环什么东西都没删,而且还没删完,就直接返回
LIE。因为接下来无论如何循环结果都不会改变。如果删完了,返回
OK。代码
#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
- 上传者