Cod sursa(job #1350335)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 20 februarie 2015 19:22:05
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<cstring>
const int M=200000;
const int N=100;
const int L=5000;
char q[M+1];
char s[N+1][L+1];
short int d[L+1][27];
short int st[M+1];
char res[M+1];
int noq,n;
void dp(int p){
    int l=strlen(s[p]);
    for(int i=1;i<=L;i++)
        for(int j=1;j<=26;j++)
            d[i][j]=-1;
    for(int i=l-1;i>=0;i--){
        for(int j=1;j<=26;j++)
            if(s[p][i+1]-'a'+1==j)
                d[i][j]=i+1;
            else
                d[i][j]=d[i+1][j];
    }
}
int main(){
    freopen("research.in","r",stdin);
    freopen("research.out","w",stdout);
    scanf("%d%d\n",&n,&noq);
    for(int i=1;i<=n;i++){
        gets(s[i]);
        int l=strlen(s[i]);
        for(int j=l;j>=1;j--)
            s[i][j]=s[i][j-1];
    }
    for(int i=1;i<=noq;i++)
        scanf("%c\n",&q[i]);
    for(int j=1;j<=n;j++){
        dp(j);
        int l=0;
        int p=0;
        for(int i=1;i<=noq;i++){
            if(q[i]=='-')
                p=st[--l];
            else{
                if(p!=-1)
                    p=d[p][q[i]-'a'+1];
                st[++l]=p;
            }
            if(p>0)
                res[i]++;
        }
    }
    for(int i=1;i<=noq;i++)
        printf("%d\n",res[i]);
    return 0;
}