题目描述
贡献法
注意: res = (res * ct) % MOD;
样例
import java.util.Scanner;
/*
1.对公式的理解 可以看成两个for循环,一层循环把s向左循环位移一次,第二层循环把t向左循环位移一次.
2.TCG向左循环位移0次是TCG,TCG向左循环位移1次是CGT,CGT向左循环位移1次是GTC
3.对于例子当中的第一行,我们发现t当中的每一次字母在s出现次数的总合,就是第一行的计算结果,其它行也是如此。
4.总结果=n倍的第一行的结果,如果想要整体最大,其实就是第一行的结果最大。
5.如何让第一行的结果最大,让t里面的每一个字母去取s里面出现最多次(假设为max)的字母。
6.那么满足条件的字符串的个数就是,max的n次幂。
假如只有一个字母出现最多次,那么就一种情况;假如有两个字母出现最多次,那么每个字母有两种选择,总的选择就是2的n次幂
*/
public class Main {
static final int N = 100010;
static final int MOD = 1000000007;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String s = scanner.next();
//大写字母的ASCII码不会超过100
int[] cnt = new int[100];
int mx = 0, ct = 0;
for (int i = 0; i < n; i++) {
/*
在这种情况下,s.charAt(i)返回的是一个字符,而不是整数,但是由于Java的自动拆装箱特性,字符可以隐式地转换为整数。
因此,cnt[s.charAt(i)]将字符转换为其对应的ASCII码值,然后使用这个ASCII码值作为数组的下标。
*/
int t = ++cnt[s.charAt(i)];
if (t > mx) {
mx = t;
ct = 1;
} else if (t == mx) {
ct++;
}
}
long res = 1;
for (int i = 0; i < n; i++) {
res = (res * ct) % MOD;
}
System.out.println(res);
}
}