中国商人銀行クレジットカード20190915
1.1。
番号軸上で、各ポイント1-nは「L」または「R」でマークされ、最初は各ポイントにロボットがあります。これで、すべてのロボットが次の操作を同時に10 ^ 100回実行します。
ポイントが「L」でマークされている場合、ロボットは左に移動します。ポイントが「R」でマークされている場合、ロボットは右に移動します。
ポイント1が「R」でポイントnが「L」であることを確認します。最終的に各ポイントにロボットはいくつありますか?
入力の説明:入力には、初期化中の各ポイントのマークを表す「R」と「L」のみを含む文字列sが含まれます。
2 <= | s | <= 10の5乗。ここで、| s |は文字列の長さを表します。
テストサンプル:
入力1:RRLRL
出力は次のとおりです:01211
入力2:RRRRRLRLRL
出力:0000331111
分析:
各Rの右側にある最も近いLのパリティ、添え字の違い、Lの左側のRの奇数は+ 1、Lの偶数は+1です。Lは同じです。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<cmath>
#include<climits>
#include<queue>
#include<cstring>
#include<set>
using namespace std;
queue<int> rque,lque;
string str;
vector<int> count1(100005,0);
int main(){
cin>>str;
//scanf("\n",&str);
int n=str.size();
for(int i=0;i<n;i++){
if(str[i]=='R'){
rque.push(i);
}
else{
while(!rque.empty()){
int temp=rque.front();
rque.pop();
if((i-temp)&1!=0)
count1[i-1]++;
else
count1[i]++;
}
}
}
for(int i=n-1;i>=0;i--){
if(str[i]=='L'){
lque.push(i);
}
else{
while(!lque.empty()){
int temp=lque.front();
lque.pop();
if((temp-i)&1!=0){
count1[i+1]++;
}
else
count1[i]++;
}
}
}
for(int i=0;i<n;i++)
printf("%d ",count1[i]);
printf("\n");
//system("PAUSE");
return 0;
}
2.2。
数字と?、?で構成される文字列は、0〜9を表すことができ、この文字列で表すことができる桁数を見つけ、残りは残りの後に5です。
40%の後、最初に一般的なアイデアを提供します。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<sstream>
#include<cmath>
#include<climits>
#include<queue>
#include<cstring>
#include<set>
#define mod 1000000007
using namespace std;
string str;
vector<vector<int> > dp(100005,vector<int>(13,0));
int main(){
cin>>str;
int n=str.size();
int base=0;
for(int i=n-1;i>=0;i--){
if(str[i]=='?'){
vector<int> tmp(13,0);
for(int j=0;j<10;j++){
tmp[((int)pow(10,base)*j)%13]++;
}
if(i+1>=n){
for(int k=0;k<13;k++){
dp[i][k]=tmp[k];
}
base++;
continue;
}
for(int j=0;j<13;j++){
for(int k=0;k<13;k++){
long long ans=(dp[i+1][j]*tmp[k])%mod;
int index=(j+k)%13;
dp[i][index]=(dp[i][(j+k)%13]+ans)%mod;
}
}
}
else{
int num=str[i]-'0';
int tmp=((int)pow(10,base)*num)%13;
//cout<<tmp<<endl;
if(i+1>=n){
dp[i][tmp]++;
base++;
continue;
}
for(int j=0;j<13;j++){
//dp[i][(j+tmp)%13]=(dp[i][(j+tmp)%13]+dp[i+1][j]+1)%mod;
dp[i][(j+tmp)%13]=dp[i+1][j];
}
}
base++;
}
printf("%d\n",dp[0][5]);
/*for(int i=0;i<n;i++){
for(int j=0;j<13;j++)
printf("%d ",dp[i][j]);
printf("\n");
}*/
//system("PAUSE");
return 0;
}