CodeForces 518B Tanya and Postcard 計數

先來錯誤代碼, Wrong answer test 8:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
using namespace std;
const int maxn = 200000 + 24;
char s[maxn], t[maxn], ans[maxn];
map<char, int> mp;
int main() {
	scanf("%s%s", s, t);
	mp.clear();
	int len = strlen(t);
	for(int i = 0; i < len; ++i) {
		mp[t[i]]++;
	}
	int ans1 = 0, ans2 = 0;
	len = strlen(s);
	for(int i = 0; i < len; ++i) {
		if(mp[s[i]] > 0) {
			ans1++;
			mp[s[i]]--;
		}
		else if(mp[s[i]] == 0) {
			if(s[i] >= 'a' && s[i] <= 'z' && mp[s[i]-32] > 0) { ans2++; mp[s[i]-32]--; }
			if(s[i] >= 'A' && s[i] <= 'Z' && mp[s[i]+32] > 0) { ans2++; mp[s[i]+32]--; }
		}
	}
	printf("%d %d\n", ans1, ans2);
}

一直wrong answer test 8,最後終於找出了一組樣例通不過:

aaaaAAAA

AAAAaaBB

答案應該是: 6 0然而以上代碼運行出結果爲 4 2;

所以應該先找出YAY!的值,跑兩次循環就可以:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
using namespace std;
const int maxn = 200000 + 24;
char s[maxn], t[maxn], ans[maxn];
map<char, int> mp;
int main() {
	scanf("%s%s", s, t);
	mp.clear();
	int len = strlen(t);
	for(int i = 0; i < len; ++i) {
		mp[t[i]]++;
	}
	int ans1 = 0, ans2 = 0;
	len = strlen(s);
	for(int i = 0; i < len; ++i) {
		if(mp[s[i]] > 0) {
			ans1++;
			mp[s[i]]--;
			s[i] = 0;
		}
	}
	for(int i = 0; i < len; ++i) {
		if(s[i] >= 'a' && s[i] <= 'z' && mp[s[i]-32] > 0) { ans2++; mp[s[i]-32]--; }
		if(s[i] >= 'A' && s[i] <= 'Z' && mp[s[i]+32] > 0) { ans2++; mp[s[i]+32]--; }
	}
	printf("%d %d\n", ans1, ans2);
}


發佈了29 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章