每日一题-枚举+乘法原理

孤独的照片-枚举+乘法原理

void solve() {
	int n;
	string s;
	cin >> n >> s;
	int ans = 0;
	for (int i = 0; i < n; ++i) {
		int l = i - 1, cnt1 = 0;
		
		while (l >= 0 and s[l] != s[i]) {
			l--;
			cnt1 ++;
		}
		
		int r = i + 1, cnt2 = 0; 
		while (r < n and s[r] != s[i]) {
			r++;
			cnt2 ++;
		}
		
		ans += cnt1 * cnt2;
		ans += max(0ll, cnt1 - 1ll) + max(0ll, cnt2 - 1ll);
	}
	
	cout << ans;
}

做法

枚举每头牛作为那个只出现一次的牛, 然后向左右扩展, 以此处为H为例:
a.左边有G, 右边也有, 对答案的贡献为左边的数量乘右边的数量(若一边没有, 则这种情况的贡献为零).
b.只取一边的牛, 如果这边没有, 贡献为零, 否则贡献为数量减一.

复杂度分析

每个点最多访问三次: 枚举其左边时向右扩展访问到, 枚举到本身时访问到, 枚举到右边时向左扩展时访问到.

posted on 2022-12-21 13:19  Whosedream-0019  阅读(137)  评论(0)    收藏  举报

导航