1 条题解

  • 0
    @ 2025-4-8 20:28:18

    题意

    构造一条指令,删除-的文件,不删除+的文件,?代表任意字符,*代表任意个数字符,*只能加在末尾。

    思路

    贪心,把要删除和保留的分开保存,然后对于要删除的每一个字母,如果全相同,就用这个字母,如果有不同,就用?,如果长短不一,末尾就用*填,然后在用构造出来的串去和保留的一一判断,如果有一个保留会被删除,就是错的。

    #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
    上传者