URAL 1654 Cipher Message 解题报告
2013-08-08 16:31
399 查看
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1654
题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保留一个。但是要注意,删除的过程中,可能会导致本来不相邻的相同字符变得相邻了,这时候也要删除。如果直接暴力:每次查看串中是否有相同的相邻字母,如果有就删去,然后继续从前向后查找,这样肯定会超时(O(N^2))。
优化的方法,利用栈的特殊结构O(N),从左向右扫描,判断当前的字符和栈顶元素是否相同,如果相同栈顶元素出栈,否则的话将这一位的元素入栈,这样线性地扫描一遍后,栈中的元素就是剩下的串。要注意输出时候不能直接从top开始,而是要逆序输出。
题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保留一个。但是要注意,删除的过程中,可能会导致本来不相邻的相同字符变得相邻了,这时候也要删除。如果直接暴力:每次查看串中是否有相同的相邻字母,如果有就删去,然后继续从前向后查找,这样肯定会超时(O(N^2))。
优化的方法,利用栈的特殊结构O(N),从左向右扫描,判断当前的字符和栈顶元素是否相同,如果相同栈顶元素出栈,否则的话将这一位的元素入栈,这样线性地扫描一遍后,栈中的元素就是剩下的串。要注意输出时候不能直接从top开始,而是要逆序输出。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; const int MAXN = 200000 + 10; char ch[MAXN], s[MAXN]; int main() { int i, top, len; while (gets(ch)) { top = 0; len = strlen(ch); memset(s, 0, sizeof(s)); for (i = 0; i < len; i++) { if (s[top] != ch[i]) // 注意,初始化的s[top=0] = 0,所以第一个元素ch[0]肯定是进栈的,从s[top=1]开始保存 { s[++top] = ch[i]; // 注意,++top不能写成top++,否则下一轮的判断指示不了栈顶元素,而是指示了栈顶元素的再上一个位置,导致判断失效 } else { top--; } } for (i = 1; i <= top; i++) { cout << s[i]; } cout << endl; } return 0; }
相关文章推荐
- URAL 1385 Interesting Number 解题报告
- [解题报告]Ural 1010 Discrete Function
- Ural 1014 Product of Digits 解题报告
- 【解题报告】 URAL 1333 Genie Bomber 2 -- 利用类似统计的方法计算覆盖效率
- URAL 1348(几何)(解题报告)
- Ural 1025 Democracy in Danger 解题报告
- URAL1785解题报告
- timus 1346. Intervals of Monotonicity URAL 解题报告 DP 小水题,阅读理解
- timus 1588. Jamaica URAL 解题报告 平面点距离和
- [解题报告]Ural 1011 Conductors
- Ural 1014 Product of Digits 解题报告
- [解题报告]ural 1041 Nikifor
- URAL 1382 Game with Cards 解题报告
- Ural 1073 Square Country 解题报告
- 1586. Threeprime Numbers 解题报告 URAL
- URAL 1931 Excellent Team 解题报告
- Ural 1005 Stone Pilet 解题报告
- URAL1197解题报告
- URAL 1935 Tears of Drowned 解题报告
- timus 1353. Milliard Vasya's Function 解题报告 URAL