问题 2110: 虚张声势
时间限制: 1Sec 内存限制: 128MB 提交: 298 解决: 61
题目描述
大战即将来临,杰洛特需要为自己声张声势,但是喊得太假有会被人识破
因此杰洛特决定连着喊出两句话,两句话中所有的字母数量全部相等则不会被识破
请指出杰洛特所喊的话是否会被识破
输入
一个t表示几组数据
接下来t组,每组第一行一句话,第二行一句话
每句话长度小于100000
输出
如果杰洛特没有被识破则输出"Yes"
如果被识破了则喊出"No"
样例输入
2
wj nb
w jnb
Iiread
readii
样例输出
Yes
No
在家好无聊,想要上课上课…
题解
- 把两句话各存一个string,需要使用getline来读取,因为含有空格,然后sort两个string,之后比较两者,如果一样就Yes,否则No。这样做比较费时间,因为sort费时间(复杂度为O(nlogn)),而且需要剔除那些空格字符。(但这不失为一种好思路,只是本题不推荐使用)
- 申请两个26大小的char数组,每有一个字符,就在相应位置 ++,来记录每一个字母的个数,最后比较这两个数组是否完全一样即可。这样做效率很高。
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main( ){
int a[26], b[26];
string d;
int n;
cin >> n;
getchar( );
while(n--){
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
getline(cin, d); //一次读取
for(int i = 0; i < d.length(); i++)
if(d[i] == ' ') //空格直接continue
continue;
else
a[d[i] - 'a']++;
getline(cin, d);
for(int i = 0; i < d.length(); i++)
if(d[i] == ' ')
continue;
else
b[d[i] - 'a']++;
bool code = 1;
for(int i=0;i<26;i++)
if(a[i] != b[i]){
code = 0;
break;
}
if(code)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}