1 条题解
-
0
题意
构造一条指令,删除-的文件,不删除+的文件,?代表任意字符,*代表任意个数字符,*只能加在末尾。
思路
贪心,把要删除和保留的分开保存,然后对于要删除的每一个字母,如果全相同,就用这个字母,如果有不同,就用?,如果长短不一,末尾就用*填,然后在用构造出来的串去和保留的一一判断,如果有一个保留会被删除,就是错的。
#include <stdio.h> #include <string.h> const int N = 1005; int t, n[2], sn, sn1; char str[15], str1[15]; struct F { char a[15], b[15]; } f[2][N]; void tra() { int s; if (str[0] == '-') s = 0; else s = 1; int i = 1, len = strlen(str), an = 0, bn = 0; for (; str[i] != '.' && i < len; i++) f[s][n[s]].a[an++] = str[i]; for (i = i + 1; i < len; i++) f[s][n[s]].b[bn++] = str[i]; n[s]++; } int judge(int i) { char c = f[0][0].a[i]; for (int j = 0; j < n[0]; j++) { if (f[0][j].a[i] != c) { if (f[0][j].a[i] == '\0' || c == '\0') return -1; return 0; } } return 1; } int judge1(int i) { char c = f[0][0].b[i]; for (int j = 0; j < n[0]; j++) { if (f[0][j].b[i] != c) { if (f[0][j].b[i] == '\0' || c == '\0') return -1; return 0; } } return 1; } bool ok1(int i) { int len = strlen(str); if (str[len - 1] == '*') len--; else if (len < strlen(f[1][i].a)) return false; for (int j = 0; j < len; j++) { if (str[j] != '\0' && f[1][i].a[j] == '\0') return false; if (str[j] != '?' && str[j] != f[1][i].a[j]) return false; } return true; } bool ok2(int i) { int len = strlen(str1); if (str1[len - 1] == '*') len--; else if (len < strlen(f[1][i].b)) return false; for (int j = 0; j < len; j++) { if (str1[j] != '\0' && f[1][i].b[j] == '\0') return false; if (str1[j] != '?' && str1[j] != f[1][i].b[j]) return false; } return true; } bool OK(int i) { if (ok1(i) && ok2(i)) return true; return false; } void make() { sn = 0; sn1 = 0; int i; memset(str, 0, sizeof(str)); memset(str1, 0, sizeof(str1)); for (i = 0; ; i++) { if (judge(i) == 1) { if (f[0][0].a[i] == '\0') break; str[sn++] = f[0][0].a[i]; } else if (judge(i) == -1) { str[sn++] = '*'; break; } else str[sn++] = '?'; } for (i = 0; ; i++) { if (judge1(i) == 1) { if (f[0][0].b[i] == '\0') break; str1[sn1++] = f[0][0].b[i]; } else if (judge1(i) == -1) { str1[sn1++] = '*'; break; } else str1[sn1++] = '?'; } } void init() { memset(n, 0, sizeof(n)); memset(f, 0, sizeof(f)); while (gets(str) != NULL && str[0] != '\0') { tra(); } } void solve() { make(); for (int i = 0; i < n[1]; i++) { if (OK(i)) { printf("IMPOSSIBLE\n"); if (t) printf("\n"); return; } } printf("DEL %s.%s\n", str, str1); if (t) printf("\n"); } int main() { scanf("%d%*c%*c", &t); while (t--) { init(); solve(); } return 0; }
- 1
信息
- ID
- 444
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者