Uva 511 Updating a Dictionary
大致题意:用{ key:value, key:value, key:value }的形式表示一个字典key表示建,在一个字典内没有重复,value则可能重复 题目输入两个字典,如{a:3,b:4,c:10,f:16} {a:3,c:5,d:10,ee:4}
于新字典相比,找出旧字典的不同,并且输出用相应格式,增加的用'+',如 +d,ee
减少的用'-',如 -b,f
value变化的用*,如 *c
没有不同则输出"No changes""
如果使用java,则可以用TreeMap对新旧字典做映射,然后对两个TreeMap对象做比较,同时注意一些小细节:
import java.util.*;
public class Main{
public static void main( String []args ) {
Scanner in = new Scanner( System.in );
int T = Integer.parseInt( in.nextLine() );
while( T!=0 ) {
T --;
String oldStr = in.nextLine();
TreeMap<String, String> oldMap = new TreeMap<>();
str2Map(oldStr, oldMap);
String newStr = in.nextLine();
TreeMap<String, String> newMap = new TreeMap<>();
str2Map(newStr, newMap);
// 三个函数都要执行
boolean isChanged = addOrDel(newMap, oldMap, '+'); // 新字典中增加
isChanged = addOrDel(oldMap, newMap, '-') || isChanged; // 旧字典中减少
isChanged = isUpdate( newMap, oldMap, '*' ) || isChanged; // 更改过的
if( !isChanged ) {
System.out.println("No changes");
}
System.out.println();
}
}
public static void str2Map( String str, TreeMap<String, String> map ) {
StringBuffer strbuffer = new StringBuffer(str);
for( int i=0; i<strbuffer.length(); i ++ ) {
if( !Character.isLetterOrDigit( strbuffer.charAt(i) ) ) {
// 将'{','}',':',','修改为空格
strbuffer.setCharAt(i, ' ');
}
}
// 以空格为分割符进行分割
StringTokenizer st = new StringTokenizer( new String(strbuffer), " ");
while( st.hasMoreTokens() ) {
map.put( st.nextToken() , st.nextToken() );
}
}
public static boolean addOrDel( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) {
boolean isChanged = false;
for( java.util.Map.Entry<String, String> entry : oldMap.entrySet()){
String strkey = entry.getKey();
// 只有其中一个字典有,而另一个字典没有
if( !newMap.containsKey(strkey) ) {
if( !isChanged ) {
System.out.print( op+strkey );
isChanged = true;
} else {
System.out.print( ","+strkey );
}
}
}
if( isChanged ) {
System.out.println();
}
return isChanged;
}
public static boolean isUpdate( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) {
boolean isChanged = false;
for( java.util.Map.Entry<String, String> entry : oldMap.entrySet() ) {
String strkey = entry.getKey();
// 新旧字典都有,但value不等
if( newMap.containsKey(strkey) && !newMap.get(strkey).equals( oldMap.get(strkey) ) ) {
if( !isChanged ) {
System.out.print( op + strkey );
isChanged = true;
} else {
System.out.print( "," + strkey );
}
}
}
if( isChanged ) {
System.out.println();
}
return isChanged;
}
}
如果是C++,也是类似的,用map做映射,也是注意一些细节即可
/*
UvaOJ 12504
Emerald
Sat 27 Jun 2015
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <map>
#include <sstream>
#include <string> using namespace std; string Standard( string str ) {
for( int i=0; i<str.length(); i++ ) {
if( !isalpha( str[i] ) && !isdigit( str[i] ) ) {
str[i] = ' ';
}
}
return str;
} void WriteMap( string& dict, std::map<string, string>& m ) {
dict = Standard( dict );
stringstream ss( dict );
string tmp, tmp2;
while( ss >> tmp ) {
ss >> tmp2;
m[ tmp ] = tmp2;
}
} bool CompareDict( std::map<string, string>& oldMap, std::map<string, string>& newMap, char op ) {
std::map<string, string>::iterator it;
bool isChanged = false;
for( it=newMap.begin(); it!=newMap.end(); it ++ ) {
if( !oldMap.count( it->first ) ) {
if( !isChanged ) {
printf("%c%s", op, it->first.c_str() );
isChanged = true;
} else {
printf(",%s", it->first.c_str());
}
}
}
if( isChanged ) {
printf("\n");
}
return isChanged;
} bool Update( std::map<string, string>& oldMap, std::map<string, string>& newMap ) {
bool isChanged = false;
std::map<string, string>::iterator it;
for( it=oldMap.begin(); it!=oldMap.end(); it ++ ) {
if( newMap.count( it->first ) && newMap[it->first]!=oldMap[it->first] ) { // defferent items
if( !isChanged ) {
printf("*%s", it->first.c_str() );
isChanged = true;
} else {
printf(",%s", it->first.c_str());
}
}
}
if( isChanged ) {
printf("\n");
}
return isChanged;
} int main() {
int T;
cin >> T;
cin.get();
while( T -- ) {
std::map<string, string> oldMap, newMap;
string oldDict;
getline( cin, oldDict );
WriteMap( oldDict, oldMap );
string newDict;
getline( cin, newDict );
WriteMap( newDict, newMap );
bool isChanged = CompareDict( oldMap, newMap, '+' ); // new add
isChanged = CompareDict( newMap, oldMap, '-' ) || isChanged ; // old del
isChanged = Update( oldMap, newMap ) || isChanged;
if( !isChanged ) {
printf("No changes\n");
}
printf("\n"); // blank line
}
return 0;
}
Uva 511 Updating a Dictionary的更多相关文章
- [ACM_模拟] UVA 12504 Updating a Dictionary [字符串处理 字典增加、减少、改变问题]
Updating a Dictionary In this problem, a dictionary is collection of key-value pairs, where keys ...
- Uva - 12504 - Updating a Dictionary
全是字符串相关处理,截取长度等相关操作的练习 AC代码: #include <iostream> #include <cstdio> #include <cstdlib& ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
- csuoj 1113: Updating a Dictionary
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 1113: Updating a Dictionary Time Limit: 1 Sec ...
- 湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)
UVA12504 - Updating a Dictionary 给出两个字符串,以相同的格式表示原字典和更新后的字典.要求找出新字典和旧字典的不同,以规定的格式输出. 算法操作: (1)处理旧字典, ...
- Problem C Updating a Dictionary
Problem C Updating a Dictionary In this problem, a dictionary is collection of key-value pairs, ...
- 【习题 5-11 UVA 12504 】Updating a Dictionary
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 不确定某个map里面是否有某个关键字的时候. 要用find来确定. 如果直接用访问下标的形式去做的话. 会强行给他加一个那个关键字( ...
- Updating a Dictionary UVA - 12504
In this problem, a dictionary is collection of key-value pairs, where keys are lower-case letters, a ...
- 【UVA】12504 Updating a Dictionary(STL)
题目 题目 分析 第一次用stringstream,真TMD的好用 代码 #include <bits/stdc++.h> using namespace std; int ...
随机推荐
- Head First SQL笔记
看的时候总结了一下,如下: Chapter 1: 创建数据库 CREATE DATABASE database_name; 使用数据库 USE database_name; 创建表 CRATE TAB ...
- 获取多个div,点击第几个,显示第几个
1.闭包:函数内部又定义了一个函数,内部函数引用外部函数的变量,就构成了闭包. <script type="text/javascript"> var divs = d ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- PHP PDO select语句结果行数计算
PDO有一个函数PDOStatement::rowCount返回上一个SQL语句影响的行数. rowCount函数对于DELETE, INSERT, 或者UPDATE语句的结果是正确的,但对于sele ...
- LintCode-不同的子序列
题目描述: 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数. 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响.(比如,“ACE”是“ ...
- 在TreeWidget中增加右键菜单功能 以及TreeWidget的基本用法
TreeWidget 与 TreeView 中实现右键菜单稍有不同, TreeView 中是靠信号与槽 connect(ui->treeView,SIGNAL(customContextMenu ...
- Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin
翻译:http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/ 最 ...
- png的格式及像素存储分析
从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据 ...
- Libev学习笔记1
和Libevent相似,Libev是一个高性事件驱动框架,据说性能比Libevent要高,bug比Libevent要少.Libev只是一个事件驱动框架,不是网络库,因为它的内部并没有任何socket编 ...
- poj 3630 Phone List(字典树)
题目链接: http://poj.org/problem?id=3630 思路分析: 求在字符串中是否存在某个字符串为另一字符串的前缀: 即对于某个字符串而言,其是否为某个字符串的前缀,或存在某个其先 ...