codeforces1149B. Three Religions

题目链接 琪亚娜世界第一可爱

这个题,题意非常的扭曲,就是给你一个字符串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;
}

发布了161 篇原创文章 · 获赞 170 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/white_156/article/details/89929177