C. Maximum width(贪心)

题意:输入n,m,再输入长度为n的字符串s和长度为m的字符串t,从字符串s里找出子序列p,要求spi和ti相同(最终达到子序列和t相同)。求
pi+1pi的最大值。(上一个字符和下一个字符的最大间隔)

题解:要最大间隔,就去找上一个字符最先出现的位置,和后一个字符最后出现的位置,即得最大值,再在众多间隔值中取出最大值就行了。

ACcode:

ll n, m, ans;
ll pos1[200100],pos2[200100];//数组太大建议放外面
int main()
{
memset(pos1, 0, sizeof(pos1));
memset(pos2, 0, sizeof(pos2));//没有循环可以省略
string a, b;
cin >> n >> m;
cin >> a >> b;
for (ll i = 0,j=0; j < m&&i<n; i++)
{
if (a[i] == b[j])
{
pos1[j] = i;
j++;
}//从前往后标记,最小值
}
for (ll j= m-1,i=n-1; j >0&&i>0; i--)
{
if (a[i] == b[j])
{
pos2[j] = i;
j--;
}//从后往前标记,最大值
}
ans = -1;
for (ll i = 0; i < m-1; i++)
ans = max(ans, pos2[i+1] - pos1[i]);//按题目要求得最大值
cout << ans;
return 0;
}

 

原文地址:https://www.cnblogs.com/Uiney117/p/14531447.html