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