卡码网不同的字符串
#include<vector>
#include<string>
#include<iostream>
using namespace std;
int main()
{
int n=0;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
vector<int>hash(26,0);
for(int j = 0;j < s.size();j++)
hash[s[j]-'a']++;
//找需要删除成对字母的字母
int res1 = 0;//代表删了多少对,也就是有res1个字母需要新增到字符串末尾
for(int k = 0;k < 26;k++)
{
if(hash[k] > 1)
{
int temp = hash[k] / 2;
hash[k] -= 2 * temp;
res1 += temp;
}
}
//找没有字母的字母空位,用于放新增的字母
int res2 = 0;
for(int k = 0;k < 26;k++)
{
if(hash[k] == 0)
res2++;
}
//如果空位大于要新增的字母数,那么操作数就是删除成对字母的数res1
//否则,新加的字母又会产生res1-res2的重复位,还需要再删res1-res2次
if(res1 > res2)
res1 += res1 - res2;
cout << res1 << endl;
}
}