1. 程式人生 > >Accordion CodeForces - 1101B (實現)

Accordion CodeForces - 1101B (實現)

rst b- mathjax 題意 return n-2 ive ons fine

An accordion is a string (yes, in the real world accordions are musical instruments, but let‘s forget about it for a while) which can be represented as a concatenation of: an opening bracket (ASCII code 091091), a colon (ASCII code 058058), some (possibly zero) vertical line characters (ASCII code 124124), another colon, and a closing bracket (ASCII code

093093). The length of the accordion is the number of characters in it.

For example, [::], [:||:] and [:|||:] are accordions having length 44, 66 and 77. (:|:), {:||:}, [:], ]:||:[ are not accordions.

You are given a string ss. You want to transform it into an accordion by removing some (possibly zero) characters from it. Note that you may not insert new characters or reorder existing ones. Is it possible to obtain an accordion by removing characters from

ss, and if so, what is the maximum possible length of the result?

Input

The only line contains one string ss (1|s|5000001≤|s|≤500000). It consists of lowercase Latin letters and characters [, ], : and |.

Output

If it is not possible to obtain an accordion by removing some characters from ss, print

1−1. Otherwise print maximum possible length of the resulting accordion.

Examples

Input
|[a:b:|]
Output
4
Input
|]:[|:]
Output
-1
題目鏈接:CodeForces - 1101B
有人說這是一個閱讀理解題,覺得有點道理,讀懂題後就很簡單了,寫代碼的時候細心一點,情況多多判斷就可以了。
題意:給你一個手風琴的字符串模型的定義,然後給你一個字符串,你可以刪除這個字符串中的一些或者0個字符,使之成為一個符合定義的字符串,
問這個處理後的字符串最大的長度?
思路:既然題目給定了字符串的定義為[: ||| :] 即左右有開關口的方括號,方括號裏面有兩個‘:‘,‘:‘裏面有若幹個(可能0個)的‘|‘字符,
那麽只需要處理下左右的方括號後再對裏面找對應的字符就好了。
具體細節可以看代碼。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), ‘\0‘, sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
char s[maxn];
int n;
int main()
{
    scanf("%s",s);
    n=strlen(s);
    int spos=-1;
    for(int i=0;i<n;i++)
    {
        if(s[i]==[)
        {
            spos=i;
            break;
        }
    }
    int epos=-1;
    for(int i=n-1;i>=0;i--)
    {
        if(s[i]==])
        {
            epos=i;
            break;
        }
    }

    if(epos==-1||spos==-1||(spos>epos))
    {
        printf("-1\n");
    }else
    {
        int cnt=0;
        int ssp=-1;
        int eep=-1;
        for(int i=spos;i<=epos;i++)
        {
            if(s[i]==:)
            {
                eep=max(eep,i);
                if(ssp==-1)
                {
                    ssp=i;
                }
                cnt++;
            }

        }
        if(cnt<2)
        {
            printf("-1\n");
        }else
        {
            int ans=4;
            for(int i=ssp;i<=eep;i++)
            {
                if(s[i]==|)
                {
                    ans++;
                }
            }
            printf("%d",ans);
        }
    }
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch ==   || ch == \n);
    if (ch == -) {
        *p = -(getchar() - 0);
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 - ch + 0;
        }
    }
    else {
        *p = ch - 0;
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 + ch - 0;
        }
    }
}


Accordion CodeForces - 1101B (實現)