首页 > 其他 > 详细

C. Maximum width(贪心)

时间:2021-03-14 10:11:37      阅读:37      评论:0      收藏:0      [点我收藏+]

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

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

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;
}

C. Maximum width(贪心)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!