题目描述
有 t 组测试数据,对于每组测试数据,给出n个字符串,保证字符串中只包含英文字母,对于每个字符串,先把其中的小写字母改写为大写字母,然后翻转字符串,然后取出每个字符串中下标为3-5的子串(s[3]s[4]s[5]),输出这些子串的数量,相同的子串只计算一次,对这些字串按字典序排序后输出(不论这个子串出现过几次,只要出现一次就输出一次),每个子串占一行,然后对于每个子串,若其中含有字母’L’,则输出Yes,否则输出No.
输入描述
第一行一个整数T(1<=T<=1000),表示测试数据的组数.
对于每组测试数据,第一行输入一个整数n(1<=n<=100),表示字符串的数量.
接下来n行,每行一个长度不低于6的字符串.
输出描述
对于每组测试数据:
第一行输出n个子串中不同子串的个数.
对于n个子串,输出连续的两行,第一行为这个子串本身,第二行为"Yes"或"No".
样例
输入
2
3
SJmskxji
wlemdnkHB
ddsjiaijH
4
SJSNDBjns
soksnwbs
hzmsjxl
SHXMksjs
输出
3
JIA
No
MDN
No
SKX
No
4
MKS
No
NDB
No
SJX
No
SNW
No
本体主要考察对STL容器以及相关用法的熟练程度。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
string str[110];//存放大字符串
map<string,int> mp;//存放字串,运用map对key值的去重和默认升序排列
int t,n;
int main()
{
cin>>t;
while(t--)
{
mp.clear();//重置map,防止上次循环的数据造成影响
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>str[i];
for(int j=0; j<str[i].size(); j++)
{
if(str[i][j]>='a'&&str[i][j]<='z')
str[i][j]-=32;//将小写转化为大写
}
//reverse(str[i].begin(),str[i].end());//倒置s1
}
for(int i=1; i<=n; i++)
{
mp[str[i].substr(3,3)]=i;//存储子串
}
cout<<mp.size()<<endl;
for(auto it=mp.begin(); it!=mp.end(); it++)
{
cout<<it->first<<endl;
int flag=0;//字串中是否有'L'
for(int i=0; i<3; i++)
{
if(it->first[i]=='L')
{
cout<<"Yes\n";
flag=1;
break;
}
}
if(!flag)
cout<<"No\n";
}
}
return 0;
}