nyoj 题目1285 缩写恢复

                                                                          缩写恢复

时间限制: 1000 ms  |            内存限制: 65535 KB
描述
多行字符串,最多10000行,由单词,单词的缩写,空格和标点符号组成。

非缩写单词有三种形式:
1.第一个字母大写,其他小写。
2.全部大写。
3.全部小写。
严格区分大小写,Are 和 are 和ARE视为不同的三个单词

缩写单词的形式为:第一个字母+中间隔着的字母的数量+最后一个字母(如abcd可缩写为a2d),
所以至少要有三个字母才会可能被缩写。缩写单词不会再被表示为缩写单词。

复原的意思是:如果一个单词在上文中出现过,则在下文中它可以被表现为缩写形式。
例如:”you are great,y1u are g3t.” 会被复原为 “you are great,you are great.”,

但是如果一个缩写形式的单词不能代表前面所有行的任何单词或者可以表示前面所有行的多个单词,就把这个缩写形式原样输出。
例如:”abc adc a1c d7k.” 会被复原为”abc adc a1c d7k.”。

现输入多行字符串,如果字符串中有缩写形式的单词,复原,输出复原后的每一行。
注意:前面的字符串会对后面有影响。
输入:一组输入,多行,每行一个字符串,每行不超过100个字符。
输出:每行输入对应一行输出,然后一个换行

输入
一组输入,多行,每行一个字符串,每行不超过100个字符。
输出
输出对应的缩写恢复后的文章
样例输入
"Both of Tian"
and the houses king g9o have T2n
three horses in different t3e
classes, namely, k2g regular, plus, and h4s super......
样例输出
"Both of Tian"
and the houses king g9o have Tian
three horses in different three
classes, namely, king regular, plus, and h4s super......
来源
easy++
上传者
chuan

解法:map(将每个不含数字的单词首尾字母的ascii码值加中间部分的长度映射本身)+stringstream(格式要注意,最好用一个字符数组存非字母非数字的字符)

#include<bits/stdc++.h>
using namespace std;
int book[10000100];
int main()
{
    string str,str2[105];
    map<string,string>pq;
    map<string,int>qp;
    int k=0;
    while(getline(cin,str))
    {
        int len=str.size();
        int f=0,j=0;
        for(int i=0;i<105;i++)
            str2[i].clear();
        for(int i=0;i<len;i++)
        {
            if(!isdigit(str[i])&&!isalpha(str[i]))
            {
                if(i==0)
                    f=1;
                str2[j]+=str[i];
                str[i]=' ';
                if(i+1==len||isalpha(str[i+1]))
                    j++;
            }
        }
        int y=j;
        stringstream ss(str);
        string buf;
        j=0;
        int v=0;
        while(ss>>buf)
        {
            if(isdigit(buf[1]))
            {
                if(f)
                    cout<<str2[j++];
                if(pq.count(buf)&&!book[qp[buf]])
                    cout<<pq[buf];
                else
                    cout<<buf;
                if(!f)
                    cout<<str2[j++];
            }
            else
            {
                string str1;
                int nlen=buf.size();
                str1+=buf[nlen-1];
                int x=nlen-2;
                while(x)
                {
                    str1+=x%10+'0';
                    x/=10;
                }
                str1+=buf[0];
                reverse(str1.begin(),str1.end());
                if(pq.count(str1))
                {
                    if(pq[str1]!=buf)
                    {
                        qp[str1]=k;
                        book[qp[str1]]=1;
                    }
                }
                else
                    pq[str1]=buf;
                if(f)
                    cout<<str2[j++];
                cout<<buf;
                if(!f)
                    cout<<str2[j++];
                k++;
            }
            v++;
        }
        if(y>v)
            cout<<str2[y-1];
        cout<<"\n";
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值