题解
题目大意 给你一个串让你删除一些字符找到最长的[?:] |可以有0个或多个
两侧向中心夹击 找到满足[:的最小的l和满足:]最大的r 最后统计中心有多少个|即可
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 5e5 + 10;
char s[MAXN];
int main()
{
#ifdef LOCAL
//freopen("C:/input.txt", "r", stdin);
#endif
scanf("%s", s + 1);
int n = strlen(s + 1);
int l = 1, r = n, k = 0;
while (l <= n && s[l] != '[') l++; //while确定位置
while (l <= n && s[l] != ':') l++; //当找到[:会停下
while (r >= 1 && s[r] != ']') r--;
while (r >= 1 && s[r] != ':') r--;
for (int i = l; i <= r; i++)
if (s[i] == '|') k++;
if (l >= r)
cout << -1 << endl;
else
cout << 4 + k << endl;
return 0;
}
从左向右一遍过的代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
string s;
cin >> s;
int a = 0, b = -1, cnt = 0, ans = -1;
for (int i = 0; s[i]; i++)
{
if (a == 0 && s[i] == '[')
a = 1; //[
else if (a == 1 && s[i] == ':')
a = 2; //[:
else if (a == 2) //左侧齐了
{
if (s[i] == '|')
cnt++;
if (s[i] == ':')
b = 4 + cnt;
if (s[i] == ']')
ans = max(ans, b);
}
}
cout << ans << endl;
return 0;
}
1319

被折叠的 条评论
为什么被折叠?



