2019亚洲区域赛徐州网络赛 M Longest subsequence
- 2019 年 10 月 4 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41603898/article/details/100608113
by duhui
记录每一个字母出现位置,贪心找 。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+5; int nex[maxn][26]; char s[maxn],t[maxn]; int ns,nt; int main() { scanf("%d %d",&ns,&nt); scanf("%s",s+1); scanf("%s",t+1); memset(nex,-1,sizeof(nex)); for(int i=ns-1; i>=0; i--) { memcpy(nex[i],nex[i+1],sizeof(nex[i+1])); nex[i][s[i+1]-'a'] = i+1; //到 第i个位置 往后每个字母第一次出现的位置 } int ans = -1,pos = 0; for(int i=1; i<=nt&&pos>=0; ++i) { for(int j=t[i]-'a'+1; j<26; ++j) { if(nex[pos][j]!=-1) { ans = max(ans, ns - nex[pos][j] + 1 + i - 1);//i-1个已经匹配 } } pos = nex[pos][t[i]-'a'];//跳到 t[i] 第一次出现的位置 if(i==nt&&pos!=ns&&pos!=-1) { ans = max(ans,nt+ns-pos); } } printf("%dn",ans); return 0; } /* 6 6 aaacbc aaacbc */