题目的意思就是问能不能用一个命令,实现删除所有要删除的,不删除所有要保留的。
输出包括给出有几组测试样例(数字输完,要记得打一个空行,手打,不是输出一个空行,否则会RE);
然后每组给出一些文件名,用一个空行结束。文件名前是-就是要删除的,是+就是要保留的。
我们要做的就是找出一个能把所有要删除的文件删除的字符串。
例如第一个样例。其实给出的标准输出并不是规范的答案;
-BP.EXE
-BPC.EXE
+TURBO.EXE
我们把要删的放在一起
-BP.EXE
-BPC.EXE
它们相同的部分是
BP*.EXE(*代表后面的东西无所谓,)
所以我们就是把要删的摆在,一位一位判断,如果某一位上字符全部都一样,就在结果字符串的这一位填上这个字符,如果不一样,就填上?代替,如果某一个串已经判断到结束了,但是其他的还没完,就加上一个 * 然后结束,然后用这个串去和所有要保留的串判断,如果删掉其中任意一个,那么就只能输出IMPOLLIBLE,全都不会删,就输出结果字符串。
要注意的是,以上步骤全都要分两部分做,文件名部分,和后缀部分,就是只对文件名进行以上操作,然后在只对后缀做以上操作,最后输出只要把文件名操作得到的串,和后缀操作得到的串,中间加个点输出就行,然后判断保留的文件会不会被删,要同时满足文件名和后缀都会被删才算;
AC代码:
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
const int N = 1000 + 5;
string resf;
string resl;
string del[N];
string delf[N];
string dell[N];
string save[N];
string savef[N];
string savel[N];
string temp[N];
int num;
int shortf;
int shortl;
int s,d;
void init() {
for (int i = 0 ;i < N ;i++) {
del[i] = "";
delf[i] = "";
dell[i] = "";
save[i] = "";
savef[i] = "";
savel[i] = "";
temp[i] = "";
}
resf = "";
resl = "";
}
int main () {
int M ;
cin >> M;
getchar();
getchar();
while(M--) {
init();
num = 0;
d = 0;
s = 0;
while(1) {
getline(cin , temp[num++] );
if(temp[num - 1] == "")
break;
}
num = num - 1;
for (int i = 0 ; i < num ;i++) {
if (temp[i][0] == '-')
del[d++] = temp[i];
if (temp[i][0] == '+')
save[s++] = temp[i];
}
for (int i = 0 ; i < d ;i++) {
int j;
for (j = 1 ; j < del[i].size() ; j++) {
if (del[i][j] == '.')
break;
delf[i] += del[i][j];
}
for (j += 1 ; j < del[i].size() ;j++) {
dell[i] += del[i][j];
}
}
for (int i = 0 ; i < s ;i++) {
int j;
for (j = 1 ; j < save[i].size() ; j++) {
if (save[i][j] == '.')
break;
savef[i] += save[i][j];
}
for (j += 1 ; j < save[i].size() ;j++) {
savel[i] += save[i][j];
}
}
int m = 99999;
int m2 =999999;
bool yes = false;
bool yes2 = false;
for (int i = 0 ; i < d;i++) {
if (delf[i].size() < m)
m = delf[i].size();
}
for (int i = 0 ; i < d;i++) {
if (dell[i].size() < m2)
m2 = dell[i].size();
}
for (int i = 0 ; i < d;i++) {
if(delf[i].size() > m) {
yes = true;
break;
}
}
for (int i = 0 ; i < d;i++) {
if(dell[i].size() > m2) {
yes2 = true;
break;
}
}
for (int i = 0; i < m; i++) {
bool flag = true;
for (int j = 0 ; j < d - 1 ;j++) {
if (delf[j][i] != delf[j + 1][i]) {
flag = false;
break;
}
}
if(flag)
resf += delf[0][i];
else {
resf += "?";
}
}
if(yes)
resf += "*";
for (int i = 0; i < m2; i++) {
bool flag = true;
for (int j = 0 ; j < d - 1 ;j++) {
if (dell[j][i] != dell[j + 1][i]){
flag = false;
break;
}
}
if(flag)
resl += dell[0][i];
if(!flag)
resl += '?';
}
if(yes2)
resl += "*";
bool ok = true;
for (int i = 0 ; i < s;i++) {
bool flag1 = true;
bool flag2 = true;
if(!yes && resf.size() != savef[i].size()) {
flag1 = false;
}
if (yes && resf.size() - 1 > savef[i].size()) {
flag1 = false;
}
if(!yes2 && resl.size() != savel[i].size()) {
flag2 = false;
}
if (yes2 && resl.size() - 1 > savel[i].size()) {
flag2 = false;
}
for (int j = 0 ;j < savef[i].size() ;j++) {
if(!yes && resf.size() != savef[i].size()) {
flag1 = false;
break;
}
if (yes && resf.size() - 1 > savef[i].size()) {
flag1 = false;
break;
}
if(resf[j] == '*')
break;
if(resf[j] != '?' && resf[j] != savef[i][j]) {
flag1 = false;
break;
}
}
for (int j = 0 ;j < savel[i].size() ;j++) {
if(!yes2 && resl.size() != savel[i].size()) {
flag2 = false;
break;
}
if (yes2 && resl.size() - 1 > savel[i].size()) {
flag2 = false;
break;
}
if (resl[j] == '*')
break;
if(resl[j] != '?' && resl[j] != savel[i][j]) {
flag2 = false;
break;
}
}
if(flag1 && flag2) {
ok = false;
cout << "IMPOSSIBLE" << endl;
break;
}
}
if(ok)
cout << "DEL "<< resf <<"."<<resl << endl;
if(M)
cout << endl;
}
return 0;
}