CF31B Sysadmin Bob 题解

Content

给定一个字符串 \(s\),请将其分解为诸如 \(\texttt{xx@xx}\) 的子串,并将分解后的所有子串输出,或者说不存在这样的方案。

数据范围:\(1\leqslant|s|\leqslant 200\)

Solution

我们运用一点贪心的想法去做。考虑从后往前遍历字符串,一遍历到 @ 的就直接将后面的还没占用过的所有字符全部和当前的 @ 以及前一个字符组成一个子串。

请注意以下情况:

  • 遍历到 @ 后,后面没有字符能够和当前的 @ 组合(包括 @ 在字符串结尾的情况)。
  • @ 在字符串的开头。
  • 字符串中根本就没有 @

Code

string s, ans[207];

int main() {
	cin >> s;
	int len = s.size(), lastat = len - 1, vis[207] = {0}, cnt = 0;
	_rep(i, len - 1, 0) {
		if(s[i] == '@' && !vis[i + 1] && i != 0 && i != len - 1) {
			cnt++;
			_for(j, i - 1, lastat) {
				ans[cnt] += s[j];
				vis[j] = 1;
			}
			lastat = i - 2;
		}
		else if(s[i] == '@' && (vis[i + 1] || i == 0 || i == len - 1))
			return printf("No solution"), 0;
		else	continue;
	}
	if(!cnt)	return printf("No solution"), 0;
	string rest = "";
	_for(i, 0, lastat)	rest += s[i];
	ans[cnt] = rest + ans[cnt];
	_rep(i, cnt, 1) {
		cout << ans[i];
		if(i != 1)	printf(",");
	}
	return 0;
}
posted @ 2021-12-17 14:22  Eason_AC  阅读(53)  评论(0)    收藏  举报