1. 程式人生 > >Wannafly挑戰賽28B(DP,思維,字符串)

Wannafly挑戰賽28B(DP,思維,字符串)

pri 一個 its lld %s pan 開始 soft const

#include<bits/stdc++.h>
using namespace std;
int n;
int nxt[3][100007];
char buff[100007];
const char *seq="msc",*pat[8]={"022012","020212","002212","012022","020122","002122","010222","001222"};
int main(){
scanf("%d%s",&n,buff);
nxt[0][n]=nxt[1][n]=nxt[2][n]=n;
for(int i=n-1;i>=0;i--)
for(int j=0;j<3;j++)

nxt[j][i]=buff[i]==seq[j]?i:nxt[j][i+1];//記錄字母最靠前出現的位置
long long ans=0;
for(int i=0;i<n;i++){//枚舉起點
int low=n;
for(int j=0;j<8;j++){//遍歷八種組合情況
int pos=i-1;//因為下面都是從pos+1開始找所以這裏將pos設置為i-1用來抵消第一次的+1
for(int k=0;pos<n&&k<6;k++)
pos=nxt[pat[j][k]-‘0‘][pos+1];//記錄出現的位置
low=min(low,pos);//取最近的可能以便留出更多的空間給終點
}
ans+=n-low;//每一個起點對應的n-low種終點
}
printf("%lld",ans);
return 0;
}

Wannafly挑戰賽28B(DP,思維,字符串)