A. As Simple as One and Two(cf)思维

原题链接:Problem - 1276A - Codeforces

题目大意:

给你一个字符串,只有小写字母,然后希望字符串里没有one/two这两个字符串,问你最小删除字母数。

这题tag是dp,但是其实就是思维 + 贪心,不要被tag迷惑了!

1.想想看,对于一个单独的one或two:

对one,如果有段序列:ooonee,删除o和e都没有删除n高效。我们要删除肯定是因为串里有one,所以n在中间肯定只有一个,那么我们删除n就是最佳的了,同理对two也是。

2.特殊情况:如果存在twone,删除o一定是最高效的。

因此有:

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
typedef pair<int, int> PII;
const double pi = acos(-1.0);
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for (int i = n; i >= (1); --i)
typedef long long ll;
#define sqar(x) ((x)*(x))

int main(){
  int t;
  string s;
  for(scanf("%d", &t); t; t--){
    vector<int> v;
    cin >> s;
    int n = s.length();
    s = " " + s;
    for(int i = 1; i <= n - 2; i++){
      if(s.substr(i, 3) == "one") v.push_back(i + 1), i += 2;
      else if(s.substr(i, 3) == "two"){
        if(i + 4 <= n && s.substr(i, 5) == "twone") v.push_back(i + 2), i += 4;
        else v.push_back(i + 1), i += 2;
      }
    }
    cout << v.size() << endl;
    for(auto i : v) cout << i << " ";
    cout << endl;
  }
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值