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