/**
* 时间限制: 3000MS
* 内存限制: 1048576KB
* 题目描述:
* 一天,小美在写英语作业时,发现了一个十分优美的字符串:这个字符串没有任何两个字符相同。于是,小美随手写下了一个字符串,她想知道这个字符串的的所有子序列,有多少个是优美的。由于答案可能会很大,输出对20210101取模后的结果。
* <p>
* 一个字符串的子序列定义为:原字符串删除0个或多个字符后剩下的字符保持原有顺序拼接组成的字符串为原串的子序列。如:ab是acba的子序列,但bc则不是。在本题中。空串也为原串的子序列。
* <p>
* 两个子序列不相同,当且仅当他们对应原串的下标不相同。如aab则含有两个子序列ab。
* 样例输入
* aabc
* 样例输出
* 12
* <p>
* 提示
* 有下列优美的子序列:””, ”a”, “a”, “b”, “c”, “ab”, “ab”, “bc”, “ac”, “ac”, “abc”, “abc”,一共12个。
*/
public class Main {
private static int size = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
// long l1 = System.currentTimeMillis();
char[] chars = str.toCharArray();
//List<Character> characterList = new LinkedList<>();
char[] list = new char[chars.length];
searchStr(chars, list, 0, 0);
System.out.println(size + 1);
// long l2 = System.currentTimeMillis();
// System.out.println(l2 - l1 + "ms");
}
private static void searchStr(char[] chars, char[] characterList, int index, int listIndex) {
for (int i = index; i < chars.length; i++) {
boolean flag = false;
//如果含有这个字符就进入下一次循环 注意这里是用listIndex代表有效数组位置
for (int j = 0; j < listIndex; j++) {
if (characterList[j] == chars[i]) {
flag = true;
break;
}
}
if (flag) continue;
characterList[listIndex++] = chars[i];
size++;
size = size % 20210101;
//测试
// for (int j = 0; j < listIndex; j++) {
// System.out.print(characterList[j] + " ");
// }
// System.out.println(" ");
searchStr(chars, characterList, i + 1, listIndex);
listIndex--;
}
}
}