牛客网的水题 链接
zzy的小号
题目描述:
学家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
题解:
简单题,就几种特殊情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int mod=1e9+7;
const int N=1e5+10;
char s[N];
int main()
{
ll ans=1;
// freopen("shuju.txt","r",stdin);
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='I'||s[i]=='i'||s[i]=='l'||s[i]=='L')
ans=(ans*4)%mod;
else if(s[i]=='o'||s[i]=='O'||s[i]=='0')
ans=(ans*3)%mod;
else if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
ans=(ans*2)%mod;
}
cout<<ans<<endl;
return 0;
}