1 条题解

  • 0
    @ 2025-8-24 22:30:47

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ZBAA_MKC
    基本退谷

    搬运于2025-08-24 22:30:47,当前版本为作者最后更新于2021-06-01 20:59:37,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    博客食用效果更佳

    本题难点在于读题,我也是读了好几遍才读懂的.

    大致题意:对于每一个字符串 SiS_i, 寻找一个以字符串 cc 为前缀的字符串,记录删去删除前缀 cc 的字符串 SiS_i 的第一位的字母。

    但在代码实现时,我们不用这样做。记字符串 cc 的长度为 lenlen,我们只需要记录 Si[len]S_i[len] 处的字母即可。

    输出时,如果某一个字母被记录过,那就输出这个字母,否则输出 *

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    
    string s[55];
    bool f[26];
    int main()
    {
        int n; 
    	cin >> n; 
    	for (int i = 1; i <= n; i++)
    	{
    		cin >> s[i];
    	}
    	string c;
    	cin >> c;
    	int len = c.size();
    	bool flg;
      	//以上为读入及预处理
    	for (int i = 1; i <= n; i++)
    	{
    		flg = true;
    		for (int j = 0; j < len; j++)
    		{
    			if (c[j] != s[i][j]) //如果当前字符串的前缀不是c
    			{
    				flg = false; 
    				break; //退出循环,找下一个字符串
    			}
    		}
    		if (flg) //如果当前字符串的前缀是c
    		{
    			f[s[i][len] - 'A'] = true; //记录下一个字母
    		}
    	}
      //输出
    	cout << "***";
    	for (int i = 0; i <= 4; i++)
    	{
    		if (f[i])
    		{
    			cout << char(i + 'A');
    		}
    		else
    		{
    			cout << "*";
    		}
    	}
    	cout << endl;
    	for (int i = 5; i <= 12; i++)
    	{
    		if (f[i])
    		{
    			cout << char(i + 'A');
    		}
    		else
    		{
    			cout << "*";
    		}
    	}
    	cout << endl;
    	for (int i = 13; i <= 20; i++)
    	{
    		if (f[i])
    		{
    			cout << char(i + 'A');
    		}
    		else
    		{
    			cout << "*";
    		}
    	}
    	cout << endl;
    	for (int i = 21; i <= 25; i++)
    	{
    		if (f[i])
    		{
    			cout << char(i + 'A');
    		}
    		else
    		{
    			cout << "*";
    		}
    	}
    	cout << "***";
    	return 0;
    }
    
    
    • 1

    信息

    ID
    6557
    时间
    1000ms
    内存
    32MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者