算法训练 虚张声势

问题 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章