zjnu1730 PIRAMIDA(字符串,模拟)
| Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 ESample 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; }轉載于:https://www.cnblogs.com/herumw/p/9464521.html
總結
以上是生活随笔為你收集整理的zjnu1730 PIRAMIDA(字符串,模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr7.4.0+mysql+solr
- 下一篇: Promise 的基础用法