hihoCoder week227 Longest Subsequence

题目链接 https://hihocoder.com/contest/hiho227/problem/1

题目详解 https://hihocoder.com/discuss/question/5587

#include <bits/stdc++.h>
using namespace std;
#define Max(a,b) ((a>b)?a:b)
const int N = 1e6+10;
int n,ans; string s[N], S;
int slen,Slen;
int f[N/10][30], id[30];

void init() 
{
    for(int i=0; i<=26; i++) 
        id[i] = Slen;
    for(int i=Slen-1; i>=0; i--) {
        for(int j=0; j<26; j++) {
            f[i][j] = id[j];
        }
        int x = S[i] - 'a';
        id[x] = i;
    }
    /*
    for(int i=0; i<Slen; i++) {
        for(int j=0; j<3; j++) {
            printf("%d%c",f[i][j],j==2?'
':' ');
        }
    }
    */
}

void solve(int k)
{
    int i=0, j=0;
    while(i == 0 && j < Slen) {          
        if(S[j] != s[k][i])
            j++;
        else 
            i++,j++;
    }
    j--;
    while(i < slen && j < Slen) {
        int x= s[k][i] -  'a';
        j = f[j][x];
        if(j >= Slen) break;
        i++;
    }
    
    if(i >= slen) {
        //cout<< k <<" "<< slen<<endl;
        ans = Max(ans, slen);
    }
    return ;
    
}

int main()
{
    freopen("in.txt","r",stdin);
    while(~scanf("%d", &n)) {
        ans = 0;
        for(int i=0; i<n; i++)
            cin >> s[i];
        cin >> S;
        Slen = S.length();
        init();
        for(int i=0; i<n; i++) {
            slen = s[i].length();
            if(slen <= ans || slen > Slen) 
                continue;
            solve(i);
        }
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Draymonder/p/9914040.html