STL简单应用问题
2015-05-26 08:58
260 查看
问题:
Input
输入的第一行是一个整数T( 1 <= T <= 100 ),表示有几组输入数
据。
每组输入由4部分组成:
(1)一个字典,最多包含2000个单词,每个单词一行。
(2)一行字符串"XXXXXX",作为字典部分的结束标志。
(3)1个或多个( 最多2000个 )需要解读的字符串。每个一行。
(4) 一行字符串"XXXXXX",作为解读部分的结束标志。
以上的每个单词都只有小写字母组成,最长不超过10。字典不一定是有序的。单词是唯一的。
Output
每组输出中,对应每个解读串A,如果有一个串B和A由相同的字母组成,则认为B可以解读A。在字典中找到所有可以解读A的串,并且以字典顺序输出,每个单词一行,然后输出一行"******"。如果没有找到符合条件的单词串,就输出一行"NO ONE",然后输出一行"******"。
Sample Input
1
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX
Sample Output
score
******
refund
******
part
tarp
trap
******
NO ONE
******
course
******
回答:
方法一:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include<map>
using namespace std;
#define M 2005
int a[M][26],b[26];
vector<string>Q;
void main()
{
int T;
scanf("%d",&T);
string str;
int flag;
int i,j,index;
while(T--)
{
Q.clear();
index=0;
while(cin>>str&&str!="XXXXXX")
{
Q.push_back(str);
index++;
}
sort(Q.begin(),Q.end());
for(i=0;i<index;i++)
{
for (j=0;j<26;j++)
a[i][j]=0;
for(j=0;j<Q[i].length();j++)
a[i][Q[i][j]-'a']++;
}
while(cin>>str&&str!="XXXXXX")
{
for(i=0;i<26;i++)
b[i]=0;
for(i=0;i<str.length();i++)
b[str[i]-'a']++;
flag=0;
for(i=0;i<index;i++)
{
for(j=0;j<26;j++)
{
if(a[i][j]!=b[j])
break;
}
if(j==26)
{
cout<<Q[i]<<endl;
flag=1;
}
}
if(!flag)
cout<<"NO ONE"<<endl;
cout<<"******"<<endl;
}
}
}
方法二:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include<map>
using namespace std;
multimap<string,string>dic;
multimap<string,string>::iterator it,it2;
void main()
{
int T;
scanf("%d",&T);
string str;
int flag;
while(T--)
{
int sub=1;
dic.clear();
while(cin>>str&&str!="XXXXXX")
{
string temp=str;
sort(str.begin(),str.end());
//dic[str]=temp;
dic.insert(pair<string,string>(str,temp));
}
string rec[2000];
while(cin>>str&&str!="XXXXXX")
{
sort(str.begin(),str.end());
flag=0;
it=dic.find(str);
if(it==dic.end())
cout<<"NO ONE"<<endl;
else
{
int index=0;
for(it2=it;it2!=dic.end();it2++)
{
if((*it2).first!=str)
break;
else rec[index++]=(*it2).second;
}
sort(rec,rec+index);
for(int i=0;i<index;i++)
cout<<rec[i]<<endl;
//cout<<(*it2).second<<endl;
}
cout<<"******"<<endl;
}
}
}
Input
输入的第一行是一个整数T( 1 <= T <= 100 ),表示有几组输入数
据。
每组输入由4部分组成:
(1)一个字典,最多包含2000个单词,每个单词一行。
(2)一行字符串"XXXXXX",作为字典部分的结束标志。
(3)1个或多个( 最多2000个 )需要解读的字符串。每个一行。
(4) 一行字符串"XXXXXX",作为解读部分的结束标志。
以上的每个单词都只有小写字母组成,最长不超过10。字典不一定是有序的。单词是唯一的。
Output
每组输出中,对应每个解读串A,如果有一个串B和A由相同的字母组成,则认为B可以解读A。在字典中找到所有可以解读A的串,并且以字典顺序输出,每个单词一行,然后输出一行"******"。如果没有找到符合条件的单词串,就输出一行"NO ONE",然后输出一行"******"。
Sample Input
1
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX
Sample Output
score
******
refund
******
part
tarp
trap
******
NO ONE
******
course
******
回答:
方法一:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include<map>
using namespace std;
#define M 2005
int a[M][26],b[26];
vector<string>Q;
void main()
{
int T;
scanf("%d",&T);
string str;
int flag;
int i,j,index;
while(T--)
{
Q.clear();
index=0;
while(cin>>str&&str!="XXXXXX")
{
Q.push_back(str);
index++;
}
sort(Q.begin(),Q.end());
for(i=0;i<index;i++)
{
for (j=0;j<26;j++)
a[i][j]=0;
for(j=0;j<Q[i].length();j++)
a[i][Q[i][j]-'a']++;
}
while(cin>>str&&str!="XXXXXX")
{
for(i=0;i<26;i++)
b[i]=0;
for(i=0;i<str.length();i++)
b[str[i]-'a']++;
flag=0;
for(i=0;i<index;i++)
{
for(j=0;j<26;j++)
{
if(a[i][j]!=b[j])
break;
}
if(j==26)
{
cout<<Q[i]<<endl;
flag=1;
}
}
if(!flag)
cout<<"NO ONE"<<endl;
cout<<"******"<<endl;
}
}
}
方法二:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include<map>
using namespace std;
multimap<string,string>dic;
multimap<string,string>::iterator it,it2;
void main()
{
int T;
scanf("%d",&T);
string str;
int flag;
while(T--)
{
int sub=1;
dic.clear();
while(cin>>str&&str!="XXXXXX")
{
string temp=str;
sort(str.begin(),str.end());
//dic[str]=temp;
dic.insert(pair<string,string>(str,temp));
}
string rec[2000];
while(cin>>str&&str!="XXXXXX")
{
sort(str.begin(),str.end());
flag=0;
it=dic.find(str);
if(it==dic.end())
cout<<"NO ONE"<<endl;
else
{
int index=0;
for(it2=it;it2!=dic.end();it2++)
{
if((*it2).first!=str)
break;
else rec[index++]=(*it2).second;
}
sort(rec,rec+index);
for(int i=0;i<index;i++)
cout<<rec[i]<<endl;
//cout<<(*it2).second<<endl;
}
cout<<"******"<<endl;
}
}
}
相关文章推荐
- ILOG OPL的一个简单应用——解决运输问题、转运问题
- TabLayout,ViewPager(Fragment)的简单应用实例,以及RecyclerView所遭遇的问题
- ACM学习历程16——List链表的应用之简单约瑟夫问题
- JFreeChart中文乱码问题,JFreeChart的简单应用
- uva 11995 I Can Guess the Data Structure! (STL的简单应用)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- STL heap简单应用
- 学习笔记——一个简单的还原短信的Android应用出现的问题
- 《第一行代码》FragmentBestPractice项目(简单新闻应用)中的不可忽视问题
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- stl应用小问题
- hud 3790 最短路径问题【Dijkstra简单应用】
- STL - for_each 简单应用
- 《解决问题1000.1》又是I2C驱动问题,产品应用上一个问题,非常简单,也比较典型,记录一下
- 成员指针的定义与简单应用(成员变量地址的问题)
- C语言对搜索的简单应用(迷宫问题
- 矩阵乘法在递推问题中的简单应用
- hud 3790 最短路径问题【Dijkstra简单应用】
- 遗传算法的简单应用-巡回旅行商(TSP)问题的求解
- 2017年浙江工业大学大学生程序设计迎新赛预赛 D 简单的数据结构【纯 stl -> List 的应用】