CF#200 div2 D Alternating Current(stack)

地址

http://codeforces.com/problemset/problem/344/D

题意

这里写图片描述
给定一个插头,从左开始到右,现在每次遇到一个正负交叉的节点就标记一下,如果+在上则标记+,-在上标记-,这是给定的输入字符串。
然后接着让你来判断,是否可以把这些节理顺,不打结,使得最后正的直接一条直线连到正并且在负的那条线上方,负的直接一条直线连到负。

解析

首先注意到标记节点数为奇数的时候是无解的,因为此时正线只能连接到下方;然后注意到连续的+或者-是可以相消的,继而想到用栈模拟括号匹配的做法。

总结

可能是因为看到了data structures的tag才…

代码

#pragma comment(linker, "/STACK:1677721600")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define pb push_back
#define mp make_pair
#define LL long long
#define lson lo,mi,rt<<1
#define rson mi+1,hi,rt<<1|1
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define FIN freopen("in.txt", "r", stdin)
#define FOUT freopen("out.txt", "w", stdout)
#define rep(i,a,b) for(int i=(a); i<=(b); i++)
#define dec(i,a,b) for(int i=(a); i>=(b); i--)

using namespace std;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double ee = exp(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 10;
const double pi = acos(-1.0);

int readT()
{
    char c;
    int ret = 0,flg = 0;
    while(c = getchar(), (c < '0' || c > '9') && c != '-');
    if(c == '-') flg = 1; else ret = c ^ 48;
    while( c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c ^ 48);
    return flg ? - ret : ret;
}

LL readTL()
{
    char c;
    int flg = 0;
    LL ret = 0;
    while(c = getchar(), (c < '0' || c > '9') && c != '-');
    if(c == '-') flg = 1; else ret = c ^ 48;
    while( c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c ^ 48);
    return flg ? - ret : ret;
}

char str[maxn];

int main()
{
    #ifdef LOCAL
    FIN;
    #endif // LOCAL
    scanf("%s", str);
    int n = strlen(str);

    if (n & 1)
    {
        puts("No");
        return 0;
    }

    stack<char> s;
    rep(i, 0, n - 1)
    {
        if (s.empty())
        {
            s.push(str[i]);
        }
        else
        {
            if (s.top() == str[i])
            {
                s.pop();
            }
            else
            {
                s.push(str[i]);
            }
        }
    }
    puts(s.empty() ? "Yes" : "No");

    return 0;
}

你可能感兴趣的:(cfGo)