首页 > 试题广场 >

配置文件恢复

[编程题]配置文件恢复
  • 热度指数:111124 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

有6条配置命令,它们执行的结果分别是:

命   令 执   行
reset reset what
reset board board fault
board add where to add
board delete no board at all
reboot backplane impossible
backplane abort install first
he he unknown command

注意:he he不是命令。

为了简化输入,方便用户,以“最短唯一匹配原则”匹配(注:需从首字母开始进行匹配):

1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;
2、若只输入一字串,但匹配命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unknown command

3、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果仍不唯一,匹配失败。
例如输入:r b,找到匹配命令reset board 和 reboot backplane,执行结果为:unknown command。
例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。

4、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果唯一,匹配成功。例如输入:bo a,确定是命令board add,匹配成功。
5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:b addr,无法匹配到相应的命令,所以执行结果为:unknow command。
6、若匹配失败,打印“unknown command”

注意:有多组输入。
数据范围:数据组数:,字符串长度
进阶:时间复杂度:,空间复杂度:

输入描述:

多行字符串,每行字符串一条命令



输出描述:

执行结果,每条命令输出一行

示例1

输入

reset
reset board
board add
board delet
reboot backplane
backplane abort

输出

reset what
board fault
where to add
no board at all
impossible
install first
为什么这里过不了这个用例,自己看这边答案是对的啊
r b
b a
bo a(这个过不了,只输出unknow那项)
reb
r
res
#include <stdio.h>
#include <string.h>

#define sign1 "reset"
#define sign2 "reset board"
#define sign3 "board add"
#define sign4 "board delete"
#define sign5 "reboot backplane"
#define sign6 "backplane abort"

#define execute1 "reset what"
#define execute2 "board fault"
#define execute3 "where to add"
#define execute4 "no board at all"
#define execute5 "impossible"
#define execute6 "install first"
#define execute7 "unknown command"

int main()
{
    char str[20];
    char s1[10], s2[10];
    int len, space;
    int i, j;

    while (scanf("%[^\n]", str) != EOF)
    {
        len = strlen(str);
        space = 0;
        for (i = 0; i < len; i++)
        {
            if (str[i] == ' ')
            {
                space = 1;
                strncpy(s1, &str[0], i);
                strncpy(s2, &str[i + 1], len - (i + 1));
                break;
            }
        }
        if (space == 0)
        {
            strncpy(s1, &str[0], len);
            if (strncmp(str, sign1, len) == 0)
            {
                printf("%s\n", execute1);
            }
            else
            {
                printf("%s\n", execute7);
            }
            memset(s1, 0, len);
        }
        else
        {
            i = strlen(s1);
            j = strlen(s2);
            if ((strncmp(s1, &sign2[0], i) == 0 && strncmp(s2, &sign2[6], j) == 0) 
            && (strncmp(s1, &sign5[0], i) != 0 || strncmp(s2, &sign5[7], j) != 0))
            {
                printf("%s\n", execute2);
            }
            else if ((strncmp(s1, &sign3[0], i) == 0 && strncmp(s2, &sign3[6], j) == 0) 
            && (strncmp(s1, &sign6[0], i) != 0 || strncmp(s2, &sign6[10], j) != 0))
            {
                printf("%s\n", execute3);
            }
            else if (strncmp(s1, &sign4[0], i) == 0 && strncmp(s2, &sign4[6], j) == 0)
            {
                printf("%s\n", execute4);
            }
            else if ((strncmp(s1, &sign5[0], i) == 0 && strncmp(s2, &sign5[7], j) == 0) 
            && (strncmp(s1, &sign2[0], i) != 0 || strncmp(s2, &sign2[6], j) != 0))
            {
                printf("%s\n", execute5);
            }
            else if ((strncmp(s1, &sign6[0], i) == 0 && strncmp(s2, &sign6[10], j) == 0) 
            && (strncmp(s1, &sign3[0], i) != 0 || strncmp(s2, &sign3[6], j) != 0))
            {
                printf("%s\n", execute6);
            }
            else
            {
                printf("%s\n", execute7);
            }
            memset(s1, 0, i);
            memset(s2, 0, j);
        }
        memset(str, 0, len);
        getchar();
    }
    return 0;
}


发表于 2025-01-23 14:52:09 回复(1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char dic1[5]="reset",dic2[5][20]={"reset board","board add","board delete","reboot backplane","backplane abort"};

int split(char* s)
{
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]==' ') return i+1;
    }
    return 0;
}
int find(char* s,int wz)
{
    int m=0,j=0,z,count=0,flag,mem=0;
    for(int i=0;i<5;i++)
    {
        z=0;flag=0;m=0;
        while(dic2[i][z]!=' ' && m<(wz-1))//判断第一段
        {
            if(dic2[i][z]!=s[m]) {flag=1;break;}
            else {z++;m++;}
        }
        if(flag==1) continue;
        else
        {
            while(dic2[i][z]!=' ') {z++;}//挪动字典指针到下一段
            int len=strlen(dic2[i]),len1=strlen(s);
            z++;m++;
            while(z<len && m<len1)//判断第二段
            {
                if(dic2[i][z]!=s[m]) {flag=1;break;}
                else {z++;m++;}
            }
            if(flag==0 && count==0) {count++;mem=i;}
            else if(flag==0 && count!=0) return 5;//防止多重匹配
        }
    }
    if(count==0) return 5;
    else return mem;
}
int main() {
    int w2;
    char cmd[21];
    while(gets(cmd)!=NULL)
    {
        w2=split(cmd);
        int flag;
        if(w2==0)//只有一条指令
        {
            flag=0;
            for(int i=0;i<strlen(cmd);i++)
            {
                if(cmd[i]!=dic1[i]) {flag=1;break;}
            }
            switch(flag)
            {
                case 0:printf("reset what\n");break;
                case 1:printf("unknown command\n");break;
            }
        }
        else
        {
            flag=find(cmd,w2);
            switch(flag)
            {
                case 0:printf("board fault\n");break;
                case 1:printf("where to add\n");break;
                case 2:printf("no board at all\n");break;
                case 3:printf("impossible\n");break;
                case 4:printf("install first\n");break;
                case 5:printf("unknown command\n");break;
            }
        }
    }
    return 0;
}

发表于 2024-06-18 11:25:32 回复(0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#define N 21

void SplitStr(char* s, int len, char inputCmd[2][N], int* cnt)
{
    *cnt = 0;
    int j = -1;
    for(int i = 0; i < len; i++){
        if(s[i] != ' '){
            inputCmd[*cnt][++j] = s[i];
        }else{
            inputCmd[*cnt][++j] = '\0';
            j = -1;
            *cnt += 1;
        }
        if(*cnt >= 2){
            break;
        }
    }
}

bool MatchOne(char cmdTwo[5][N], char inputCmd[], int len, char tempCmd[][N], int* temCnt)
{
    for(int i = 0; i < 5; i++){
        int flag = 1;
        for(int j = 0; j < len; j++){
            if(cmdTwo[i][j] != inputCmd[j]){
                flag = 0;
                break;
            }
        }
        if(1 == flag){
            *temCnt += 1;
            strcpy(tempCmd[*temCnt], cmdTwo[i]);
        }
    }
    if (*temCnt > -1){
        return true;
    }
    return false;
}

bool MatchTwo(char inputCmd[], int len, char tempCmd[][N], int* temCnt, char tempCmd2[5][N])
{
    int cnt = -1;
    for(int i = 0; i <= *temCnt; i++){
        int flag1 = 0;
        int flag2 = 1;
        int firstStrCnt = 0;
        for(int j = 0; j < strlen(tempCmd[i]); j++){
            if(tempCmd[i][j] == ' '){
                flag1 = 1;
                firstStrCnt = j;
                continue;
            }
            if(0 == flag1){
                continue;
            }
            if(j-firstStrCnt-1 >= len){
                break;
            }
            if(inputCmd[j-firstStrCnt-1] != tempCmd[i][j]){
                flag2 = 0;
                break;
            }
        }
        if(1 == flag2){
            strcpy(tempCmd2[++cnt], tempCmd[i]);
        }
    }
    if(cnt == 0){
        return true;
    }
    return false;
}

int main()
{
    char s[N] = {0};
    while(gets(s) != NULL){
        char temCmd2[5][N]  = { 0 };
        int len = 0;
        char inputCmd[2][N] = {0};
        int cnt = 0;
        int unknownFlag = 0;
        len = strlen(s);
        SplitStr(s, len, inputCmd, &cnt);
        if(cnt == 0){
            // 输入命令只有1个字符串
            int len1 = strlen(inputCmd[0]);
            int flag = 1;
            char cmdSingle[N] = "reset";
            for(int i = 0; i < len1; i++){
                if(inputCmd[0][i] != cmdSingle[i]){
                    flag = 0;
                }
            }
            if(1 == flag){
                strcpy(temCmd2[0], cmdSingle);
            }else{
                unknownFlag = 1;
            }
        }else if(cnt == 1){
            // 输入命令有2个字符串
            int len1 = strlen(inputCmd[0]);
            int len2 = strlen(inputCmd[1]);
            char temCmd[5][N] = { 0 };
            int temCnt = -1;
            char cmdTwo[5][N] = {
                "reset board", "board add", "board delete", "reboot backplane", "backplane abort",
            };
            if(MatchOne(cmdTwo, inputCmd[0], len1, temCmd, &temCnt)){
                if(!MatchTwo(inputCmd[1], len2, temCmd, &temCnt, temCmd2)){
                    unknownFlag = 1;
                }
            }else{
                unknownFlag = 1;
            }
        }else{
            // 输入命令超过3个字符串
            unknownFlag = 1;
        }
        if(1 == unknownFlag){
            printf("unknown command\n");
        }else{
            if(strcmp(temCmd2[0], "reset") == 0){
                printf("reset what\n");
            }else if(strcmp(temCmd2[0], "reset board") == 0){
                printf("board fault\n");
            }else if(strcmp(temCmd2[0], "board add") == 0){
                printf("where to add\n");
            }else if(strcmp(temCmd2[0], "board delete") == 0){
                printf("no board at all\n");
            }else if(strcmp(temCmd2[0], "reboot backplane") == 0){
                printf("impossible\n");
            }else{
                printf("install first\n");
            }
        }
    }
    return 0;
}

发表于 2023-10-15 18:45:27 回复(0)
#include <stdio.h>
#include <string.h>

typedef struct hash{
    char key1[21];
    char key2[21];
    char value[21];
}Hash;

Hash hash[7] = {{"reset", " ","reset what"},
                {"reset", "board","board fault"},
                {"board", "add","where to add"},
                {"board", "delete","no board at all"},
                {"reboot", "backplane","impossible"},
                {"backplane", "abort","install first"},
                {" ", " ","unknown command"}};
int main() {
    char str[21];
    while(gets(str))
    {
        int len = strlen(str);
        int single = 1;         //是否只是1关键字
        char key1[21] = {};
        char key2[21] = {};
        int key1_len = 0;
        int key2_len = 0;
        for(int i=0; i<len; i++){   //提取输入的关键字key1,key2
            if(str[i] == ' ')
            {
                single = 0;
                continue;
            }
            if(single == 1)
                key1[key1_len++] = str[i];
            else
                key2[key2_len++] = str[i];
        }

        if(single == 1)     //1字串只能匹配1关键字且只能匹配“reset”
        {
            if(memcmp(hash[0].key1,key1,key1_len) == 0)
                printf("%s\n", hash[0].value);
            else
                printf("%s\n", hash[6].value);
        }
        else 
        {
            int index = 0;
            int tag = 0;
            for(int i=1; i<=5; i++)
            {
                if(memcmp(hash[i].key1,key1,key1_len) == 0 && \
                memcmp(hash[i].key2,key2,key2_len) == 0)
                {
                    index = i;      //匹配成功第i条命令
                    tag++;          //匹配成功数
                }
            }
            if(tag == 1)
                printf("%s\n",hash[index].value);
            else 
                printf("%s\n", hash[6].value);
        }
    }
    return 0;
}

发表于 2023-03-04 19:38:03 回复(0)
思路比较清楚的解法
#include <stdio.h>
#include <string.h>
/*思路:找空格,拆开两边分别用memcmp(str1, str2, n)比较前n个字节,比较成功记录序号,相应输出
input:r|e|s|e|t| |b|o|a|r|d| |
      ^         ^           ^
      in        cp          in+strlen(in)
*/
int main(void)
{
    char in[21] = {0};
    char cmd[7][2][10] = {{"#", "#"},
                          {"reset", "#"}, 
                          {"reset", "board"}, 
                          {"board", "add"},
                          {"board", "delete"}, 
                          {"reboot", "backplane"}, 
                          {"backplane", "abort"} };
    char ans[7][20] = {"unknown command", 
                       "reset what", 
                       "board fault", 
                       "where to add", 
                       "no board at all", 
                       "impossible", 
                       "install first"};
    int i, success;
    char* cp = NULL;

    while(scanf("%[a-z ]\n", in) != EOF){
        success = 0;
        cp = NULL;
        if( ( cp = strchr(in, ' ') ) != NULL ){    //有空格,分别匹配两词
            for(i=2; i<7; i++){                    //遍历比较
                if(memcmp(in, cmd[i][0], cp-in ) == 0 && 
                   memcmp(cp+1, cmd[i][1],  in+strlen(in)-(cp+1) ) == 0){
                    if(!success){
                        success = i;
                    }else{
                        success = 0;               //不唯一时,认为不成功
                        break;
                    }
                }
            }
        }else if(memcmp( in, cmd[1][0], strlen(in) ) == 0 ){//无空格只有一种
            success = 1;
        }

        printf("%s\n", ans[success]);
    }
}


发表于 2022-01-09 11:27:14 回复(0)
IDE试了好多都没有问题,上传牛客却只能过一个用例,求大佬给看看。
#include <stdio.h>
#include <string.h>

int main()
{
	char str[20];
	char *CASE[6] = {"reset","reset board","board add","board delete","reboot backplane","backplane abort"};
	char *RESULT[6] = {"reset what","board fault","where to add","no board at all","impossible","install first"};
		
	while (gets(str))
	{
		int i;
		int index;  // 用来确定输出RESULT字符串数组的第几个字符串 
		int count=0; // 用来确定同一类型关键字能够匹配成功的次数 
		int len = strlen(str);
		for (i=0;i<6;i++)
		{
			if (!strchr(str,' '))
			{
				if (!strchr(CASE[i],' '))
				{
					if (strncmp(CASE[i],str,len)==0)
					{
						index = i;
						count++;
					}
				}
			}
			else
			{
				if (strchr(CASE[i],' '))
				{
					char *a;
					a = strchr(str,' ');     //将输入字符串的空格以后的部分存入字符串a 
					int len_a = strlen(a);    
					
					char b[20];
					strncpy(b,str,len-len_a);    //打印出输入字符串空格以前的部门 
					int len_b = strlen(b);
					
					if (strncmp(CASE[i],b,len_b)==0 && strncmp(strchr(CASE[i],' '), a, len_a)==0)
					{ 
						index = i;
						count++;
					}
					memset(b,'\0',sizeof(b)-1);
				}
			}
		}
		if (count==1)
		{
			printf("%s\n",RESULT[index]);
		}
		else
		{
			printf("unknown command\n");
		}		
	}
	return 0;
} 



发表于 2021-11-19 10:55:44 回复(0)
题意先匹配第一关键字再匹配第二关键字容易误导,一起匹配就好了。
先判断第二关键字是否为空
#include <stdio.h>
#include <string.h>
#define SIZE 20

const char *result[7] = {
    "unknown command","reset what","board fault","where to add",
    "no board at all","impossible","install first"
};

int match(char *arr);

int main(void)
{
    char arr[SIZE+2];
    while(fgets(arr,SIZE+1,stdin)){
        if(arr[strlen(arr) - 1] == '\n') arr[strlen(arr) - 1] = '\0';
        printf("%s\n",result[match(arr)]);
    }
    return 0;
}

int match(char *arr)
{
    char *first,*second,*pt;
    int ans = 0;
    
    pt = arr;
    while(*pt != ' ' && *pt != '\0') pt++;
    if(*pt = ' ') *pt++ = '\0';
    first = arr;
    second = pt;
    
    if(*second == '\0'){
        if(strstr("reset",first)) ans = 1;
    }else{
        if(strstr("reset",first) && strstr("board",second)){
            if(strstr("reboot",first) && strstr("backplane",second)) ans = 0;
            else ans = 2;
        }else if(strstr("board",first) && strstr("add",second)){
            if(strstr("backplane",first) && strstr("abort",second)) ans = 0;
            else ans = 3;
        }else if(strstr("board",first) && strstr("delete",second)){
            ans = 4;
        }else if(strstr("reboot",first) && strstr("backplane",second)){
            ans = 5;
        }else if(strstr("backplane",first) && strstr("abort",second)){
            ans = 6;
        }
    }
    return ans;
}



发表于 2021-11-08 16:38:08 回复(0)
#define    _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    void cmd_out(int index);
    char* cmd1[6] = { "reset","reset","board","board","reboot","backplane" };
    char* cmd2[6] = { "no use","board","add","delete","backplane","abort" };
    char in[30] = "\0";
    while (gets(in))
    {
        int len, i, pos = 0, possite = 1;
        int index;
        len = strlen(in);
        if (len > 16)
        {
            printf("unknown command\n");
            continue;
        }
        for (i = 0; i < len; i++)
        {
            if (in[i] == ' ')
            {
                pos = i;
                possite = 0;
                break;
            }
        }

        if (possite)
        {
            if (strncmp(in, cmd1[0], len) == 0)
            {
                printf("reset what\n");

            }
            else
            {
                printf("unknown command\n");
            }
        }
        else
        {
            int cnt = 0;
            for (i = 1; i < 6; i++)
            {
                if (strncmp(in, cmd1[i], pos) == 0 && strncmp(in + pos + 1, cmd2[i], len - pos - 1) == 0)
                {
                    cnt++;
                    index = i;
                }
            }
            if (cnt != 1)
            {
                printf("unknown command\n");
            }
            else
            {
                cmd_out(index);

            }
        }
    }
    return 0;
}
void cmd_out(int index)
{
    switch (index)
    {
    case 0:
        printf("reset what\n");
        break;
    case 1:
        printf("board fault\n");
        break;
    case 2:
        printf("where to add\n");
        break;
    case 3:
        printf("no board at all\n");
        break;
    case 4:
        printf("impossible\n");
        break;
    case 5:
        printf("install first\n");
        break;
    default:
        printf("unknown command\n");
        break;
    }
}

发表于 2021-08-12 12:02:02 回复(0)