逆序单词
在英文中有很多逆序的单词,比如dog和god,evil和live等等。
现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词。
Input第1行:1个整数,N,表示单词数量。2≤N≤50,000。
第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母。保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye)。
Output第1行:1个整数,表示单词表中逆序单词的对数。
6 dog live hiho evil coder godSample Output
2
思路:利用set函数里的元素不允许重复的特点,如果你想向set中添加一个它之前已有的元素,这是存不进去的,即相当于集合里的元素互异性;再结合string的reverse函数来反转进行操作。
#include <iostream>
#include<set>
#include<algorithm>
using namespace std;
int main()
{
int n;
set<string> s;
string s1;
cin>>n;//输入字符串的个数
for(int i=0;i<n;i++)
{
cin>>s1;//输入字符串
s.insert(s1);//将s1存入s中
reverse(s1.begin(),s1.end());//将s1反转
s.insert(s1);//如果s1反转后,在s中有和它相同的元素,即存在逆序单词,那么它就不会被存进去。
}
cout<<n-s.size()/2<<endl;
//s.size()表示s中的元素个数,因为在s里面一个单词它既存了本身也存了自身反转后的单词,所以除以2得到真正的单词个数(从输入的字符串中存入的)
//逆序单词的个数=单词总个数(n)-真正存入单词个数(s.size()/2)
return 0;
}