#C++初学记录(ACM8-6-cf-f题)

F. Vanya and Label

While walking down the street Vanya saw a label "Hide&Seek". Because he is a programmer, he used & as a bitwise AND for these two words represented as a integers in base 64 and got new word. Now Vanya thinks of some string s and wants to know the number of pairs of words of length |s| (length of s), such that their bitwise AND is equal to s. As this number can be large, output it modulo 1e9?+?7.

To represent the string as a number in numeral system with base 64 Vanya uses the following rules:
digits from ‘0‘ to ‘9‘ correspond to integers from 0 to 9;
letters from ‘A‘ to ‘Z‘ correspond to integers from 10 to 35;
letters from ‘a‘ to ‘z‘ correspond to integers from 36 to 61;
letter ‘-‘ correspond to integer 62;
letter ‘_‘ correspond to integer 63;

Input

The only line of the input contains a single word s (1?≤?|s|?≤?100?000), consisting of digits, lowercase and uppercase English letters, characters ‘-‘ and ‘_‘.

Output

Print a single integer — the number of possible pairs of words, such that their bitwise AND is equal to string s modulo 1e9?+?7.


Examples
input

z

output

3

input

V_V

output
9

input

Codeforces

output

130653412

Note

For a detailed definition of bitwise AND we recommend to take a look in the corresponding article in Wikipedia.

In the first sample, there are 3 possible solutions:


z&?=?61&63?=?61?=?z
&z?=?63&61?=?61?=?z
z&z?=?61&61?=?61?=?z

正确代码

#include<bits/stdc++.h>
using namespace std;
#define modd 1000000007
int main(){
    char a[100006];
    cin>>a;
    long long lena=strlen(a);
    long long ans=1;
    long long n;
    for(int i=0;i<lena;i++){

        n=0;

        if(a[i]>='0'&&a[i]<='9')
        n=a[i]-'0';

        if(a[i]>='A'&&a[i]<='Z')
        n=a[i]-'A'+10;

        if(a[i]>='a'&&a[i]<='z')
        n=a[i]-'a'+36;

        if(a[i]=='-')
        n=62;

        if(a[i]=='_')
        n=63;

        for(int j=0;j<6;j++){
            if(((n>>j)&1)==0){
                ans=(ans*3)%modd;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
} 

题目理解

给出一个字符串,字符串中可能含有1-9的数字,a-z的字母,A-Z的字母,然后将他们全部转化成题目给出的编码,得到编码后,通过程序进行判断有多少个字符组合通过AND(&)符运算后不会改变字符串中字符的编码。

相关知识点
本题完成需要读懂题目,判断字符串中编码不仅仅是将其化为ascll码,而是要根据题意进行初始编码后再进行化为二进制,其次二进制的判断是位移运算符与AND运算符结合完成的,具体代码为


        for(int j=0;j<6;j++){
            if(((n>>j)&1)==0){
                ans=(ans*3)%modd;
            }
        }

由题意得出最大代码为63的“_”,即不超过64位,因此二进制可以化为六位数正好小于2^6,到此代码编写与理解完成。

原文地址:https://www.cnblogs.com/xiaofengqaq/p/11307921.html

时间: 2024-11-13 07:58:21

#C++初学记录(ACM8-6-cf-f题)的相关文章

【CF刷题】14-05-12

Round 236 div.1 A:只需要每个点连接所有比他大的点,知道边用完为止. //By BLADEVIL #include <cmath> #include <cstdio> #define maxn 25; using namespace std; int main() { int task; scanf("%d",&task); while (task--) { int n,p; scanf("%d%d",&n,&

2017Summmer_上海金马五校 F题,G题,I题,K题

以下题目均自己搜 F题  A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R,然后对整个数组扫一遍对于每一个下标取m=min(L[i],R[i]);用ans取2*m-1中的最大值.LIS用nlogn的算法实现,二分用的是lower_bound(),直接看代码. //Author: xiaowuga #include <bits/stdc++.h> #define maxx

七夕专场-F题

LH很聪明.每次这种题目,他想想就有结果了,我得琢磨一阵才恍然大悟.诶,智商不在一个等级啊.其实是用做差,一直用新读入的减去前面2个数之差.sum为0就满足. #include<iostream> using namespace std; int g[10010]; int main() { int t,m; cin >> t; while(t--) { cin >> m; int sum = 0; for(int i = 0;i <m;i++) { cin &g

HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是把区间 (l,r) 中大于x的数跟 x 做gcd操作. 线段树区间更新的题目,每个节点保存一个最大和最小值,当该节点的最大值和最小值相等的时候表示这个区间所有的数字都是相同的,可以直接对这个区间进行1或2操作, 进行1操作时,当还没有到达要操作的区间但已经出现了节点的最大值跟最小值相等的情况时,说明

2014 BNU邀请赛F题(枚举)

Football on Table 题意:一些杆上有人,人有一个宽度,然后现在有一个球射过去,要求出球不会碰到任何人的概率 思路:计算出每根杆的概率,之后累乘,计算杆的概率的时候,可以先把每块人的区间长度再移动过程中会覆盖多少长度累加出来,然后(1?总和/可移动距离)就是不会碰到的概率 代码: #include <stdio.h> #include <string.h> #include <math.h> const double eps = 1e-8; int t,

CF GYM100548 (相邻格子颜色不同的方案数 2014西安区域赛F题 容斥原理)

n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m). m种颜色取k种 C(m, k) 这个可以放最后乘 那么问题就变成只用k种颜色第一个格子有k种涂法 第二个有k-1种 第三个也是k-1种 一共就是k*(k-1)^(n-1) 这种算法仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色 也就是多算了恰好出现2种 恰好出现3种...

在cf水题の记录

CF1158C 题意:有排列p, 令\(nxt_i\)为\(p_i\)右侧第一个大于\(p_i\)的数的位置,若不存在则\(nxt_i=n+1\) 现在整个p和nxt的一部分丢失了,请根据剩余的nxt,构造出一个符合情况的p,输出任意一解. 使有解的充要条件是对于每一个i不存在\(j\in(i,nex_i)\)满足\(nex_j>nex_i\) 也就是说对于每个\(i\)向\(nxt_i\)连一条边,然后没有两条边相交 对于点\(i\)向\(nex_i\)和满足\(j<i \ \wedge n

多校+CF简单题

A - The Unsolvable Problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description There are many unsolvable problem in the world.It could be about one or about zero.But this time it is about bigger numb

哈理工校赛F题 递归分治

比赛时不会,在小岛的帮助下还是把这道题做出来了 F.粉刷栅栏 Description 给定一组长度为 n 的栅栏,从左到右高度依次是 h[i]. 你需要对这个栅栏粉刷油漆,每次你可以粉刷一行或者一列. 问最少粉刷几次,可以给所有栅栏上漆.(不能多刷) Input 第一行包含一个整数,表示栅栏的长度. 接下来的一行,包含 n 个数(n <= 5000),依次表示 h[i](0 <= h[i]<= 10). Output 输出一行表示对应的答案.. Sample Input 1 5 2 2