题意:

在一篇文章中,单词可以缩写.例如单词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. 洛谷-P3927 SAC E#1 - 一道中档题 Factorial

    原址 题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. ...

  2. JDBC和分包

    JDBC(Java Data Base Connectivity,java数据库连接) JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...

  3. 1044 拦截导弹 1999年NOIP全国联赛提高组 个人博客:attack.cf

    1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold         题目描述 Description 某国为了防御敌 ...

  4. android中常见的设计模式有哪些?

    建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...

  5. 初识Spinner

    Spinner是个下拉列表框,与listview一样,也是adapterView的一个间接子类,是一个显示数据的窗口. <Spinner android:id="@+id/spinne ...

  6. zabbix2升级zabbix3

    1.停服zabbix2,停服数据库/etc/init.d/zabbix_server stop/etc/init.d/mysqld stop 2.物理备份数据库cd /var/lib/mysql/ta ...

  7. ArcGIS Server 10.1发布GP服务

    ArcGIS Server 10.1发布GP服务 ArcGIS Server 10.1发布GP服务确实更简单了,只是刚使用不怎么习惯.ArcGIS Server 10.1发布GP服务需要先在ArcCa ...

  8. UVA 10905 Children's Game (贪心)

    贪心,假如任意给出一个序列,如果两两交换了以后会变大,那么就交换,直到不能交换为止. #include<bits/stdc++.h> using namespace std; ; stri ...

  9. CF Gym 100187A Potion of Immortality (思路,最坏情况的最小损失)

    根据兔子试药情况可以缩小范围,如果死了,不在试过的药里面,如果活着,在试过的药里. 最糟的情况: 两个原则 1.能确定魔药所在的范围的尽量大,2.死得兔子尽量多. 如果当前不知道情况的药n为k的二倍以 ...

  10. Android(java)学习笔记134:Android数据存储5种方式总结

    1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...