缩写恢复
时间限制:
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;
}