题意:

在一篇文章中,单词可以缩写.例如单词Internationalization可以缩写为I18n,缩写的两端是原单词的首尾字母,中间的数字是被省略的字母的个数.

现在给你一篇缩写的文章,输出展开后的文章.

一个被缩写的单词展开有条件限制:

  • 之前出现过的单词中有且只有一个符合这种缩写形式

展开缩写的时候还有一个规则:

  • 如果缩写形式首尾字母都是小写,那么展开后的单词字母全部小写
  • 如果缩写形式首尾字母都是大写,那么展开后的单词字母全部大写
  • 如果缩写形式首字母大写,尾字母小写,那么展开后的单词首字母大写,其余字母小写
  • 只有以上三种情况

比如:

Sample

s4e --> sample

S4e --> Sample

S4E --> SAMPLE

分析:

我开了一个 std::set<string> S[L][R][x]用来保存出现过的单词中 符合首字母为L尾字母为R中间省略了x个字母的单词的集合.

在读入的时候:

  • 如果遇到特殊符号直接输出不用处理.
  • 如果遇到单词,原样输出,然后把它统一处理成小写的形式插入到对应的集合.
  • 如果遇到缩写形式:
    • 如果对应单词集合的size为1,那么按照题中要求的规则输出.
    • 否则该单词不能被展开,原样输出.
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
using namespace std; bool isAlpha(char c) {
if('a' <= c && c <= 'z') return true;
if('A' <= c && c <= 'Z') return true;
return false;
} bool isNum(char c) { return '' <= c && c <= ''; } bool ok(char c) { return isAlpha(c) || isNum(c); } int id(char c) {
if('a' <= c && c <= 'z') return c - 'a';
return c - 'A';
} bool isBig(char c) { return 'A' <= c && c <= 'Z'; } char Toup(char c) {
if('A' <= c && c <= 'Z') return c;
return 'A' + c - 'a';
} char Tolow(char c) {
if('a' <= c && c <= 'z') return c;
return 'a' + c - 'A';
} set<string> S[][][]; string line; int main()
{
//freopen("in.txt", "r", stdin); while(getline(cin, line)) {
int l = line.length();
int s, t;
for(s = ; s < l; s++) {
if(isAlpha(line[s]))
{
for(t = s; t < l && ok(line[t]); t++); t--;
string sub = line.substr(s, t - s + );
int len = sub.length();
int lft = id(sub[]), rgh = id(sub[len-]);
if(len > && isNum(sub[])) {
int x = ;
for(int i = ; i < len && isNum(sub[i]); i++)
x = x * + sub[i] - ''; if(x >= && (int)S[lft][rgh][x].size() == ) {
string ans = *(S[lft][rgh][x].begin());
int _len = ans.length();
if(isBig(sub[])) ans[] = Toup(ans[]);
if(isBig(sub[len-])) for(int i = ; i < _len; i++) ans[i] = Toup(ans[i]);
cout << ans;
}
else cout << sub;
}
else {
cout << sub;
if(len >= ) {
for(int i = ; i < len; i++) sub[i] = Tolow(sub[i]);
S[lft][rgh][len-].insert(sub);
}
}
s = t;
}
else cout << line[s];
}
printf("\n");
} return ;
}

代码君

BNU 3692 I18n 模拟的更多相关文章

  1. bnu 4352 XsugarX的疯狂按键识别(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4352 [题意]:给你个长串,输出该长串中能第一放出的技能,每个技能有对应的一个小子串,不能放出任何技 ...

  2. 模拟MVC-WebForm实现ModelBinding

    (一) 前言                                                                           用ASP.NET MVC的时候,我们都 ...

  3. 使用 jQuery.i18n.properties 实现 Web 前端的国际化

    jQuery.i18n.properties 简介 在介绍 jQuery.i18n.properties 之前,我们先来看一下什么是国际化.国际化英文单词为:Internationalization, ...

  4. Struts2之i18N国际化

    对于i18n其实没有太多内容,一般的公司用不到这些内容,除非是跨国公司,但即便是跨国公司也不一定会使用i18n来进行国际化处理,所以本篇内容仅供大家了解,不做深入的探讨,希望通过本篇内容,可以帮助大家 ...

  5. Java 模拟面试题

    1.面向对象的特点 继承,封装,多态 2.对象和类的区别是什么? 对象是对客观事物的抽象,类是对对象的抽象.类是一种抽象的数据类型,它们的关系是,对象是类的实例,类是对象的模板. 3.静态成员和实例成 ...

  6. BNUOJ 52308 We don't wanna work! set模拟

    题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52308 We don't wanna work! Time Limit: 60000msM ...

  7. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  8. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  9. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

随机推荐

  1. 关于Identityserver4和IdentityServer3 授权不兼容的问题

    使用IdentityServer3 作为授权服务器,如果没有设置证书,而且client又没有设置AccessTokenType = AccessTokenType.Reference,则获取token ...

  2. 使用CRA开发的基于React的UI组件发布到内网NPM上去

    前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...

  3. .net core 的跨域

    .net core 的跨域问题花了 我很长时间 接下来我简单的描述下解决过程 首先我在前端用jquery的ajax去调用自己的本地接口大致如下 $.ajax({ type:"POST&quo ...

  4. ajax在购物车中的应用

    代码如下: 购物车页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  5. virtualapk爬坑心得

    1.宿主和插件的工程build.gradle必须是 com.android.tools.build:gradle:2.1.3 gradle-wrapper 必须是 gradle-2.14.1-all ...

  6. 手机安全卫士——在设置中心 自定义view和自定义属性

    自定义组合控件 1. 自定义一个View, 继承ViewGroup,比如RelativeLayout,此文中是SettingItemView 2. 编写组合控件的布局文件,在自定义的View中加载   ...

  7. js读取excel数据后的时间格式转换

    使用xlsx.full.min.js 获取excel的日期数据为:37858: 拿到的整数值是日期距离1900年1月1日的天数,这时需要写一个函数转换: function formatDate(num ...

  8. javascript简单计算器实践

    参考部分资料,编写一个简单的计算器案例,虽然完成了正常需求,但是也有不满之处,待后续实力提升后再来补充,先把不足之处列出: 1:本来打算只要打开页面,计算器的输入框会显示一个默认为0的状态,但是在输入 ...

  9. Nginx+Keepalived负载均衡+后端LNMP网站集群

    Centos6.4 x86,4台,地址是10.10.10.11-14,vip给的100,目标是在13和14安装nginx+keepalived,11和12安装nginx+mysql+php,做为web ...

  10. ABAP和Java单例模式的攻防

    ABAP CLASS zcl_jerry_singleton DEFINITION PUBLIC FINAL CREATE PRIVATE . PUBLIC SECTION. INTERFACES i ...