CodeForces - 344D
Description Mad scientist Mike has just finished constructing a new device to search for extraterrestrial intelligence! He was in such a hurry to launch it for the first time that he plugged in the power wires without giving it a proper glance and started experimenting The device is powered by two wires "plus" and "minus". The wires run along the floor from the wall (on the left) to the device (on the right). Both the wall and the device have two contacts in them on the same level, into which the wires are plugged in some Mike knows the sequence in which the wires run above each other. Mike also noticed that on the left side, the "plus" wire is always plugged into the top contact (as seen on the picture). He would like to untangle the wires without unplugging them and without To understand the problem better please read the notes to the test samples. Input The single line of the input contains a sequence of characters "+" and "-" of length n (1?≤?n?≤?100000). Output Print either "Yes" (without the quotes) if the wires can be untangled or "No" (without the quotes) if the wires cannot be untangled. Sample Input Input -++- Output Yes Input +- Output No Input ++ Output Yes Input - Output No Hint The first testcase corresponds to the picture in the statement. To untangle the wires, one can first move the "plus" wire lower, thus eliminating the two crosses in the middle, and then draw it under the "minus" wire, eliminating also the remaining two crosses. In the second testcase the "plus" wire makes one full revolution around the "minus" wire. Thus the wires cannot be untangled: In the third testcase the "plus" wire simply runs above the "minus" wire twice in sequence. The wires can be untangled by lifting "plus" and moving it higher: In the fourth testcase the "minus" wire runs above the "plus" wire once. The wires cannot be untangled without moving the device itself: |
题意分析:
首先是提供两根无限长的电线,两端中间有交叉部分,图中为给你一部分,并且两端上面都是正极。以下始终都是负极。然后则是给你一连串字符串,分别表示他们交叉部分是正极在上面还是负极在上面。然后是从第一个交叉部分開始分开电线。显然假设是连续两个为同极的话,则对于有没有交叉都没有影响。由于思考就能够发现。假设同样的话,能够将这交叉的部分拉开就会形成一个负极与正极交叉的部分,假设还是同样。一样能够将电线拉开,所以用一个栈来维护结果。假设遇到不同的交叉部分则压栈。假设遇到了与栈顶同样的交叉部分,则弹出栈顶元素。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; typedef long long LL; #define lson rt << 1, l, mid #define rson rt << 1|1, mid + 1, r #define root 1, 1, N const int MAXN = 1e5 + 5; char str[MAXN]; char stack[MAXN]; int main(){ scanf("%s", str); int top = 0; int n = strlen(str); for(int i = 0 ;i < n;i ++){ if(top == 0 || stack[top] != str[i]){ stack[++ top] = str[i]; } else -- top; } if(top == 0) printf("Yes\n"); else printf("No\n"); return 0; }