题目链接 琪亚娜世界第一可爱
这个题,题意非常的扭曲,就是给你一个字符串S,然后一位一位的给你三个字符串A B and C。问在给出一位后,A B C组成的序列是不是S的一个子序列(或者说是一个不连续的子串)。
记pos[i][j]为在字符串S中,位置i以后,第一次出现字符 j+‘a’ 的位置。
记dp[i][j][k]为第一个字符串A匹配到第i位,字符串B匹配到第j位,字符串C匹配到第k位。
#include <stdio.h>
#include <climits>
#include <cstring>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
#include <string>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const int maxn=1e5+5;
int N,Q;
char store[maxn];
int len[3],star[3],finish[3];
char S[3][255];
int pos[maxn][26];
int dp[255][255][255];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>N>>Q;
cin>>store+1;
for(register char c='a';c<='z';c++){
int nowPos=1;
while(store[nowPos]!=c && nowPos<=N)
nowPos++;
pos[0][c-'a']=nowPos;
}
rep(i,1,N+1){
for(register char c='a';c<='z';c++){
int index=c-'a';
int last=pos[i-1][index];
if(last>i){
pos[i][index]=last;
}else{
int nowPos=i+1;
while(store[nowPos]!=c && nowPos<=N)
nowPos++;
pos[i][index]=nowPos;
}
}
}
rep(i,0,26){
pos[N+1][i]=N+1;
}
rep(i,0,3)
len[i]=0;
char op,add;
int index;
rep(daisiki,0,Q){
cin>>op>>index;
index--;
switch(op){
case '+':
cin>>add;
len[index]++;
S[index][len[index]]=add;
rep(i,0,3){
star[i]=(i==index)? len[i]:0;
}
rep(i,star[0],len[0]+1){
rep(j,star[1],len[1]+1)
rep(k,star[2],len[2]+1){
if(i+k+j) dp[i][j][k]=N+1;
if(i) dp[i][j][k]=min(dp[i][j][k],pos[dp[i-1][j][k]][S[0][i]-'a']);
if(j) dp[i][j][k]=min(dp[i][j][k],pos[dp[i][j-1][k]][S[1][j]-'a']);
if(k) dp[i][j][k]=min(dp[i][j][k],pos[dp[i][j][k-1]][S[2][k]-'a']);
}
}
break;
case '-':
len[index]--;
break;
}
if(dp[len[0]][len[1]][len[2]]>N){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
}
}
re 0;
}