問題 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;
}