题目描述:有一串字符串,只包含0 6 8 9 这四个字符,你可以随意选择位置将它们反转180度,例如6可以反转为9,08可以反转为80。
解题思路:假设每一个字符串都能翻转出不同的新字符串,那么一共可以翻转出n*(n-1)/2个新字符串,加上原字符串,一共n*(n-1)/2+1个字符串。我们发现对于两侧结尾为0-0、8-8、6-9、9-6的字符串,实际上还是翻转它内部的字符串,所以我们需要减去上述情况。
对于0-0、8-8: 减去num*(num+1)/2
对于6-9、9-6:减去num6*num9
值得注意的是,题目要求求得翻转后的字符串数量,而对于字符串中存在0或8的字符,翻转后可以得到原字符串,而对于字符串全由6或9组成的则不可以,所以这种情况需要减1。
代码如下:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<stdio.h>
using namespace std;
#define int long long
int t,num,sum;
int a,b,c,d;
signed main()
{
cin>>t;
while(t--)
{
a=0,b=0,c=0,d=0;
string s;
cin>>s;
int len=s.size();
sum=(len+1ll)*len/2+1;
for(int i=0;i<len;i++)
{
switch (s[i]) {
case '0':
a++;
break;
case '6':
b++;
break;
case '8':
c++;
break;
case '9':
d++;
break;
}
}
sum-=((a+1ll)*a/2+(c+1ll)*c/2+b*d);
if(b==len||d==len)sum--;
cout<<sum<<endl;
}
return 0;
}