单词缩写(abbr.cpp)每日一题
题目描述:
YXY 发现好多计算机中的单词都是缩写,如 GDB,它是全称 Gnu DeBug 的缩写。但是,有时缩写对应的全称并不固定,如缩写 LINUX,可以理解为:
(1)LINus's UniX (2)LINUs's miniX (3)Linux Is Not UniX
现在 YXY 给出一个单词缩写,以及一个固定的全称(由若干个单词组成,用空格分隔)。全称中可能会有无效的单词,需要忽略掉,一个合法缩写要求每个有效的单词中至少有一个
字符出现在缩写中,缩写必须按顺序出现在全称中。对于给定的缩写和一个固定的全称,问有多少种解释方法。解释方法为缩写的每个字母出现在全称中每个有效单词中的位置,有一个字母位置不同,就认为是不同的解释方法。
输入格式:
第一行输入一个 N,表示有 N 个无效单词;接下来 N 行分别描述一个由小写字母组成的无效单词;接下来是若干个询问,先给出缩写(只有大写字母),然后给出一个全称。读
入以“LAST CASE”结束。
输出格式:
对于每个询问先输出缩写,如果当前缩写不合法。则输出“is not a valid abbreviation”,否则输出“can be formed in i ways”(i 表示解释方法种数)。
样例输入 :
2
and
of
ACM academy of computer makers
RADAR radio detection and ranging
LAST CASE
样例输出:
ACM can be formed in 2 ways
RADAR is not a valid abbreviation
数据范围 : 1<=N<=100,每行字符串长度不超过 150,询问不超过 20,所给数据计算出
来的最后方案数不超过 10^9。
数据范围很小,此题暴力修改+一般DP
贴代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
int n,l1,l2,l3;
char s[],sc[][],mb[],t[];
bool judge(char *a,char *b)
{
int x=strlen(a),y=strlen(b);
if(x!=y)return ;
for(int i=;i<x;i++)
if(a[i]!=b[i])return ;
return ;
}
int main()
{
freopen("abbr.in","r",stdin);
freopen("abbr.out","w",stdout);
n=read();
for(int i=;i<n;i++)scanf("%s",sc[i]);
cin.getline(s,);
while()
{
char tmp[];
memset(tmp,,sizeof(tmp));
memset(mb,,sizeof(mb));
memset(s,,sizeof(s));
cin.getline(tmp,);
if(!strcmp(tmp,"LAST CASE"))break;
int l0=strlen(tmp);;bool ok=;
l1=l2=l3=;
int i = ;
while(tmp[i] != ' ') mb[l1++] = tmp[i++];
for(i++; i < l0; i++) s[l2++] = tmp[i];
// printf("%s\n%s\n", mb, s);
ok=;
int st=,en=,now=;
bool had[];
memset(had,,sizeof(had));
memset(tmp,,sizeof(tmp));
memset(t, , sizeof(t));
for(i = ; i < l2;) {
char tw[]; int tcnt = ;
while(i < l2 && s[i] != ' ') {
tw[tcnt++] = s[i];
i++;
}
i++;
tw[tcnt] = ;
bool ok = ;
for(int j = ; j < n; j++) if(!strcmp(sc[j], tw)) {
ok = ; break;
}
if(!ok) continue;
for(int j = ; j < tcnt; j++) t[l3++] = tw[j];
t[l3++] = ' ';
}
l3--;
// printf("%s %s\n", mb, t);
int cnt=;
for(int i=;i<l3;i++) if(t[i]==' ')cnt++;
if(cnt>l1)
{
printf("%s is not a valid abbreviation\n",mb);
continue;
}
int dp[][][];
memset(dp,,sizeof(dp));
for(int i=l1;i>=;i--)mb[i]=mb[i-];
for(int i=l3;i>=;i--)t[i]=t[i-];
// printf("new: %s %s\n", mb + 1, t + 1);
dp[][][]=;
for(int i=;i<=l3;i++)
{
if(t[i]==' ')continue;
for(int j=;j<=min(i,l1);j++)
{
// printf("%d %d: %d %d\n", i, j, dp[i][j][0], dp[i][j][1]);
if(t[i+]==' ')
{
if(t[i+]-'a'==mb[j+]-'A')dp[i+][j+][]+=dp[i][j][];
dp[i+][j][]+=dp[i][j][];
continue;
}
if(t[i+]-'a'==mb[j+]-'A')dp[i+][j+][]+=(dp[i][j][]+dp[i][j][]);
dp[i+][j][]+=dp[i][j][];dp[i+][j][]+=dp[i][j][];
}
}
for(int i=;i<=l1;i++)printf("%c",mb[i]);
if(!dp[l3][l1][])printf(" is not a valid abbreviation\n");
else printf(" can be formed in %d ways\n",dp[l3][l1][]); }
return ;
}
单词缩写(abbr.cpp)每日一题的更多相关文章
- [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写
A string such as "word" contains the following abbreviations: ["word", "1or ...
- [LeetCode] Valid Word Abbreviation 验证单词缩写
Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...
- [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
- P1624 单词缩写
P1624 单词缩写 题目描述 树树发现好多计算机中的单词都是缩写,如GDB是全称Gnu DeBug的缩写.但是,有时候缩写对应的全称会不固定,如缩写LINUX可以理解为: (1) LINus’s U ...
- 每日一题,是否存在(c语言)
每日一题:1.是否存在 是否存在描述猫咪非常喜欢饼干,尤其是字母饼干.现在,她得到一些字母饼干,她希望选择他们中的一些拼写某些单词. 你的任务是确定她是否可以拼出自己想要的单词. 输入输入包含若干测试 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
随机推荐
- vps使用(centos)2
SVN Server搭建 1.安装软件包 [root@cloud ~]# yum install subversion mysql-server httpd mod-dav_svn mod-perl ...
- Android开发(22)--seekBar采用handler消息处理操作
本案例简单实现进度条可走,可拖拽的功能,下面请看源码: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/ ...
- Android屏幕适配问题详解
上篇-Android本地化资源目录详解 :http://www.cnblogs.com/steffen/p/3833048.html 单位: px(像素):屏幕上的点. in(英寸):长度单位. mm ...
- Web开发必回知识点
Web前端必须知道 一.常用那几种浏览器测试?有哪些内核(Layout Engine)? 1.浏览器:IE,Chrome,FireFox,Safari,Opera. 2.内核:Trident,Geck ...
- pch文件的作用和配置
pch文件说白了就是一个头文件,只不过这个头文件的类在全局都可以使用,所以说非常的方便,并不用在每个类里面都写一些重复类的头文件,只要将用到的类的头文件放到pch文件里面就行了,当然了还有就是宏定义, ...
- HTTP协议----ETag
Etag是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是服务器控制的,就像Cookie那样. 服务器首先产生ETag,服务器可在稍后使用它来 ...
- 十件你需要知道的事,关于openstack-trove(翻译)
开源数据库即服务OpenStack Trove应该知道的10件事情 作者:Ken Rugg,Tesora首席执行官 Ken Rugg是Tesora的创始人,CEO和董事会成员. Ken的大部分职业都是 ...
- IOS网络请求中文转码
-(void)get { NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小码哥&pwd=520it ...
- Android进程回收的一些知识
关于OOM_ADJ说明: Android 进程易被杀死的情形: 参考:Android进程保活招式大全
- action中list传到JSP中取不到值的问题
今天遇到了这个问题 action中list传到JSP中取不到值 搞了半天是因为我在JSP中取值的的时候 <s:iterator value="shlist" var=&qu ...