题目描述:
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)每日一题的更多相关文章

  1. [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写

    A string such as "word" contains the following abbreviations: ["word", "1or ...

  2. [LeetCode] Valid Word Abbreviation 验证单词缩写

    Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...

  3. [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  4. P1624 单词缩写

    P1624 单词缩写 题目描述 树树发现好多计算机中的单词都是缩写,如GDB是全称Gnu DeBug的缩写.但是,有时候缩写对应的全称会不固定,如缩写LINUX可以理解为: (1) LINus’s U ...

  5. 每日一题,是否存在(c语言)

    每日一题:1.是否存在 是否存在描述猫咪非常喜欢饼干,尤其是字母饼干.现在,她得到一些字母饼干,她希望选择他们中的一些拼写某些单词. 你的任务是确定她是否可以拼出自己想要的单词. 输入输入包含若干测试 ...

  6. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  7. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  8. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  9. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

随机推荐

  1. CAS-ticket not recognized

    描述:项目用单点登陆后,在页面中刷新时报错,错误信息如下: Servlet.service() for servlet default threw exception: org.jasig.cas.c ...

  2. 初级FTP搭建

    一:了解FTP基本知识 Vsftpd 1.什么是FTP? File Transfer Protocol 基于C/S结构的文件传输协议2.使用什么协议?什么端口? TCP 21 建立命令链路 TCP 2 ...

  3. NodeJS stream 一:Buffer

    当年是看了朴灵的九浅一深 NodeJS 入门的 Node, 朴大大的书讲实践很少更多的篇幅用在了讲原理上,道理听了那么多,后来开始在前端工程领域使用 NodeJS 却处处掣肘,总结原因发现 NodeJ ...

  4. Java垃圾回收机制的工作原理

    Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 获取更多内容,请关注小编个人微信公众平台: 一.Java中引入垃圾回收机制的作用 ...

  5. CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)

    数组是存储同一类型数据的数据结构 数组的声明与初始化 int[] a; int a[]; int[] a = new int[100]; int[] a = new int[100]; for (in ...

  6. openssh-clients(CentOS 7 自带的SSH客户端)

    OpenSSH 有自带的服务端 openssh-server(sshd服务) 和 客户端 openssh-clients(ssh命令),平时使用SSH远程登陆Linux都是在本地Windows上使用P ...

  7. 【完全背包】HDU 1284 钱币兑换问题

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Out ...

  8. 关于IIS强制配置启用IE8以上浏览器兼容打开系统

    关于兼容性问题,采用了IIS7自定义标头的方案,经测试,适用可行.(本人使用的是第二种方式) 指定自定义 HTTP 响应标头 1.使用 IIS Web  服务器为站点定义自定义标头即可为您的网站指定文 ...

  9. mysqldump 备份直接至压缩文件,提高备份及压缩时间

    1.备份及压缩分开 备份mysqldump --single-transaction -hlocalhost --all-databases --triggers --routines --event ...

  10. 面向对象---java代码块

    概念:代码块是指用{}括起来的一段代码. 根据位置及声明的关键字不同,代码块可分为普通代码块.构造块.静态代码块.同步代码块4种. 1.普通代码块: 直接在方法中或在语句中定义 public clas ...