Description

Sample Input


6
JANJETINA
5
1 J
1 A
6 N
6 I
5 E

Sample Output


1
0
2
1
1

题意:给你一个长度小于等于10^6的字符串,然后每次让它循环铺盖,构成层数为n的塔,让你求得第i层塔中某个字符的个数。

思路:首先要注意到字符串是从左到右覆盖该行和从右到做覆盖该行不影响结果,所以我们全部考虑为从左到右覆盖。我们先遍历一遍字符串,用vector<int>vect[30]记录字符为i的所有位置。然后我们看c是不是能被字符串的长度len整除,如果能,那么答案就是vec[c-'A'+1].size()*c/len,如果不能整除,那么我们就要把余下的部分算完。当我们把中间的整段字符串都去掉的时候,余下的部分可能是前面一串,或者后面一串,或者前面后面都有剩下的,这里一开始我直接算前一串的开头到len-1中的数量加上后一串的0到结尾的数量,但是wa了,因为这样的想法是错误的。因为我这样算可能会包含已经算过的,比如abcdefabcdef,如果我选第2个b和倒数第2个e,那么我这样算的话,会包含之前算过的,因为两个字符间的距离大于len了。所以我们要采用别的方法,起始点q固定,尾节点变为(q+(c%len))%len,那么起始点和尾节点之间的距离一定小于len了,这样就不会重复算了。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 1000050
vector<int>vec[30];
vector<int>::iterator it;
int len;
int chuli(int pos,int bianhao)
{
int i,j;
int p;
p=upper_bound(vec[bianhao].begin(),vec[bianhao].end(),pos)-vec[bianhao].begin();
return p;
}
int getkaitou(ll ceng)
{
int i,j;
ll sum;
if(ceng==1)return 0;
if(ceng%2==0)sum=( (ceng/2%len)*((ceng-1)%len)+1 )%len;
else sum=( (ceng%len)*((ceng-1)/2%len)+1 )%len;
if(sum==0)sum=len-1;
else sum--;
return sum;
}
char s[maxn]; int main()
{
int m,i,j;
ll n,c;
while(scanf("%lld",&n)!=EOF)
{
scanf("%s",s);
len=strlen(s);
for(i=1;i<=26;i++)vec[i].clear(); for(i=0;i<len;i++){
vec[s[i]-'A'+1].push_back(i);
}
char str[10];
int p;
ll sum;
scanf("%d",&m);
while(m--){
scanf("%lld%s",&c,str);
int bianhao=str[0]-'A'+1;
int kaitou=getkaitou(c);
if(c%len==0){
printf("%lld\n",(ll)vec[bianhao].size()*(ll)(c/len) );
continue;
}
ll beishu=c/len;
sum=0;
sum+=(ll)beishu*(ll)vec[bianhao].size();
ll jianju=c%len;
int jiewei=(kaitou+jianju-1)%len;
if(kaitou<=jiewei){
printf("%lld\n",sum+chuli(jiewei,bianhao)-chuli(kaitou-1,bianhao) );
}
else{
printf("%lld\n",sum+chuli(jiewei,bianhao)+chuli(len-1,bianhao)-chuli(kaitou-1,bianhao) );
}
}
}
return 0;
}

zjnu1730 PIRAMIDA(字符串,模拟)的更多相关文章

  1. 用字符串模拟两个大数相加——java实现

    问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...

  2. HDU-3787(字符串模拟)

    Problem Description 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开.现在请计算A+B的结果,并以正常形式输出.   Input 输入包含 ...

  3. HDU-1002.大数相加(字符串模拟)

    本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include <cstdio&g ...

  4. Codeforces Round #425 (Div. 2) B. Petya and Exam(字符串模拟 水)

    题目链接:http://codeforces.com/contest/832/problem/B B. Petya and Exam time limit per test 2 seconds mem ...

  5. HDU-Digital Roots(思维+大数字符串模拟)

    The digital root of a positive integer is found by summing the digits of the integer. If the resulti ...

  6. Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)

    P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...

  7. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  8. codeforces 723B Text Document Analysis(字符串模拟,)

    题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...

  9. Codeforces 1090B - LaTeX Expert - [字符串模拟][2018-2019 Russia Open High School Programming Contest Problem B]

    题目链接:https://codeforces.com/contest/1090/problem/B Examplesstandard input The most famous characters ...

随机推荐

  1. JVM-03

    目录 1.1 新生代垃圾收集器 1.1.1 Serial 垃圾收集器(单线程) 1.1.2 ParNew 垃圾收集器(多线程) 1.1.3 Parallel Scavenge 垃圾收集器(多线程) 2 ...

  2. LeetCode167 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  3. 剑指offer 面试题9:用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移 ...

  4. 【分布式锁的演化】终章!手撸ZK分布式锁!

    前言 这应该是分布式锁演化的最后一个章节了,相信很多小伙伴们看完这个章节之后在应对高并发的情况下,如何保证线程安全心里肯定也会有谱了.在实际的项目中也可以参考一下老猫的github上的例子,当然代码没 ...

  5. Head First 设计模式 —— 15. 与设计模式相处

    模式 是在某情境(context)下,针对某问题的某种解决方案. P579 情景:应用某个模式的情况 问题:你想在某情境下达到的目标,但也可以是某情境下的约束 解决方案:一个通用的设计,用来解决约束. ...

  6. ctfhub技能树—sql注入—时间盲注

    打开靶机 查看页面信息 测试时间盲注 可以看到在执行命令后会有一定时间的等待,确定为时间盲注 直接上脚本 1 #! /usr/bin/env python 2 # _*_ coding:utf-8 _ ...

  7. hello2 部分代码解析

    ResponseServlet.java源码文件 1 @WebServlet("/response") //以@WebServlet注释开头,注释指定相对于上下文根的URL模式, ...

  8. 原生ajax分享

    最近被大佬问了一个很有趣的问题,你还能手打出一个ajax吗?,我当时的想法是有现成的为什么要自己打,后来我反思了一下(只有靠自己才是强者),在这里给大家分享一个我自己打的ajax,也是自己的一个知识点 ...

  9. 从零搭建一个IdentityServer——集成Asp.net core Identity

    前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...

  10. 通俗易懂的解释:什么是API

    API 全称 Application Programming Interface,即应用程序编程接口. 看到这里,急性子的小白同学马上就憋不住了:这不管是英文还是中文我每个字都懂啊,只是凑一块就不知道 ...