Wannafly挑战赛13 A-zzy的小号
链接:https://www.nowcoder.com/acm/contest/80/A
来源:牛客网
题目描述
学家zzy根据字体的特点,创建了一系列小号… I_Love_Chtholly!
又到了打wannafly的时候,许许多多的大佬准备注册小号开始虐场,zzy也不例外,他发现他的电脑的字体有一个特点!某些不同的字符所显示的是一样的!
满足以下四种情况之一,所显示的字符是一样的
1、两个字符互为英文字母的大小写
2、大写的’i’和小写的’l’
3、大写的’o’和数字’0’
4、基于前三种情况,三个字符a,b,c,如果a和b显示相同,b和c显示相同,那么a和c显示也是相同的
珂学家zzy想知道,对于一个他看起来相同的昵称,有多少个看起来一样的昵称
两个字符串看起來一样当且仅当长度一样且每个对应的位置的字符看起來一样
输入描述:
一个字符串,只包含大小写字母和数字
输出描述:
共一行一个整数,表示看起来一样的昵称数,由于这个数比较大,所以只要求输出模1e9 + 7意义下的解
示例1
输入
abcdl
输出
64
说明
第一个位置、第二个位置、第三个位置、第四个人位置都只有两种显示相同的字符
第五个位置有四种显示相同的字符
备注:
字符串长度1<=|S|<=1e5
思路
其实也就是考个理解
1、两个字符互为英文字母的大小写(即忽略大小写,2种显示相同的字符)
2、大写的’i’和小写的’l’(即 i、I、l、L,4种显示相同的字符)
3、大写的’o’和数字’0’(即 o、O、0,3种显示相同的字符)
注意:不要把 数字 1 混进去了。。
AC代码
#include <iostream>
#include <string>
#include <algorithm>
#define Mod 1000000007
typedef unsigned long long ull;
using namespace std;
int main()
{
string s;
cin >> s;
transform(s.begin(), s.end(), s.begin(), ::toupper);
ull ans = 1;
for(int i=0;i<s.size();i++){
char ch = s[i];
if(ch=='Q'||ch=='W'||ch=='E'||ch=='R'||ch=='T'||ch=='Y'||ch=='U'||ch=='P'||
ch=='A'||ch=='S'||ch=='D'||ch=='F'||ch=='G'||ch=='H'||ch=='J'||ch=='K'||
ch=='Z'||ch=='X'||ch=='C'||ch=='V'||ch=='B'||ch=='N'||ch=='M'){
ans*=2;
ans=ans%(Mod);
}else if(ch=='I'||ch=='L'){
ans*=4;
ans=ans%(Mod);
}else if(ch=='0'||ch=='O'){
ans*=3;
ans=ans%(Mod);
}
}
cout << ans << endl;
return 0;
}