0%

51nod-1884-变换字符串

题目:
有一个字符串S,长度为n,现在要对其作变换。变换的规则如下:对于第i(1<=i<=n)个字符,可以保持不变,或者变换为第i-1个字符(如果有的话)或者第i+1个字符(如果有的话)。

请计算一下最多可以变换出多少种不同的字符串,最后总数对 1000000007(109+7) 取余后输出。

样例解释:

样例1中,变换出来的字符串是aa, ag, ga,和 gg。

样例2中,只能变换出aa。

输入
多组测试数据。
第一行有一个整数T(1 ≤ T ≤ 128),表示测试数据的数目。
接下来有T组数据。
每一数据给出一个字符串S(1<=|S|<=1000,只由小写字母组成)。
输出
对于每一组数据,输出一个整数表示答案,占一行。
输入样例
样例输入1
2
ag
aa
输出样例
样例输出1
4
1
解法:
统计每个位置可以变得个数,然后相乘即可
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<set>
#include<string>
using namespace std;
long long mod = 1e9 + 7;
long long solve(string s)
{
int l = s.length();
long long ans = 1;
for(int i = 0; i < l; i++){
set<char> c;
if(i - 1 >= 0)
c.insert(s[i - 1]);
c.insert(s[i]);
if(i + 1 < l)
c.insert(s[i + 1]);
ans = (ans * c.size()) % mod;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
string s;
cin >> s;
printf("%lld\n",solve(s));
}
return 0;
}he