题意:给一输入序列,要求用其构成字典序最小的序列,除第一字符外,每次往序列添加字符时有两种选择的操作:添加在序列第一个或最后一个位置,求可能的构造方案数。
思路:易得该题的答案等于 2^输入序列前端的相同字符个数,因为只有这里会生成不同的构成顺序但构造的序列相同。
accode:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[100010];
ll qk(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b &1)
ans *= a;
a = a * a;
b /= 2;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
int cnt = 0;
for(int i = 2; i <= n; i++)
{
if(s[i] == s[i-1])
cnt++;
else
break;
}
ll ans = qk(2, cnt);
cout<<ans<<endl;
}
return 0;
}