题目描述如下:
大致含义是一旦发现字符串中存在pie或者map单词就要去掉其中的一个字符将该单词销毁,问最少要销毁几个字符
笔者这里对kmp算法还是一知半解,但是本题大可不必用,遍历一遍字符串遇到俩单词让ans加一即可,同时一个小细节时map的尾巴和pie的头是一样的,如果遍历到mapie的时候,特判一下,不用销毁两个字符,只用销毁p即可
ac代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N=1e6+10;
int a[N];
int t,n;
void solve(){
int ans=0;
string s;
cin>>n>>s;
for(int i=0;i<s.size();i++){
if((s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')||(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')){
ans++;
}
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p'&&s[i+3]=='i'&&s[i+4]=='e'){
ans--;
}
}
cout<<ans<<endl;
}
signed main(){
cin>>t;
while(t--){
solve();
}
return 0;
}