洛谷B3748 [语言月赛202304] 写大作业[巧用26字母表]

题目描述
在这里插入图片描述
输入格式
第一行是两个整数,分别表示文献的数量 n 和操作的数量 q。
接下来 n 行,每行一个字符串,第 i行的字符串表示 si。
接下来 q 行,每行三个整数 op, x, y,其含义见『题目描述』。
输出格式
对个操作 22,输出一行一个字符串。如果 sx和 sy相似,则输出 Yes,否则输出 No。
在这里插入图片描述

step(60分)

直接暴力求解,但是后面会tle,可做参考,不做详解

#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<string>
#include<set>
using namespace std;;
int n,m;
map<int, string>mm;
bool  check(string a, string b){
    set<int>s1;
    set<int>s2;
    if (a.size() != b.size()) return false;
    for (int i = 0; i < a.size(); i++)
        s1.insert(a[i]), s2.insert(b[i]);
    if (s1!=s2) return false;
    return true;
}
int main()
{
    cin >> n >> m;
    string s;
    for (int i = 1; i <= n; i++){
        cin >> s;
        mm[i] = s;
    }
    while (m--){
        int a, b, c;
        cin >> a >> b >> c;
        if (a == 1)
        {
            mm[c] += mm[b];
            mm[b].clear();
        }
        else
        {
            if (check(mm[c],mm[b]))
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
    }
	return 0;
}

step(100分)

能不能重新排成一样的字符串关键就在于:每一个出现的字母在俩字符串里面的个数是否一样:因此我们可以借助26个字母进行循环,这样就可以防止超时:而且这里打把一个字符串加入到另一个字符串后面的操作也可以看成把一个字符串里面a~z出现的个数加到另一个字符串里面

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;;
int n,m;
string mm[100005];//定义每一个位置的字符串
char cc[100005][26];//记录每一个字母出现的次数
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);//加快读入,因为数据太大防止超时
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        cin >> mm[i];
        for (int j = 0; j < mm[i].size(); j++)
            cc[i][mm[i][j] - 'a']++;//记录字母出现数量
    }
    while (m--){
        int a, b, c;
        cin >> a >> b >> c;
        if (a == 1)
        {
            for (int j = 0; j < 26; j++) cc[c][j] +=cc[b][j];
        }
        else
        {
            bool st = true;
            for (int j = 0; j < 26; j++) 
                if (cc[b][j] != cc[c][j]) {
                    st = false;
                    break;//已经完蛋了直接结束break
                }
            if (st) cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
    }
	return 0;
}```


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值