题目描述
输入格式
第一行是两个整数,分别表示文献的数量 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;
}```