B - Pursuing the Happiness 题目链接
题意:
Mike wants to find a substring «happiness» in the string s, but Constantine cannot allow this and decided…
题意:给一个字符串,让你交换字符串中两个不同位置的字母,使之不能形成子串“happiness”.如果可以实现,输出“YES"和交换字母的位置。如果不能实现,输出"NO".
思路:简单模拟,思路不难,注意细节!
反思:以后做题一定要注意细节!一定要定义清楚变量!
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bits/stdc++.h>
#include<map>
#define ins 0x3f3f3f3f
//#define int long long int
using namespace std;
const int N = 2e5 + 10;
string st;
int cnt, u, v, w, a[30];
bool flag;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> st;
for(int i = 0; i < st.size(); i++){
flag = false;
if(st[i] == 'h'){
if(st[i+1] == 'a' && st[i+2] == 'p' && st[i+3] == 'p' && st[i + 4] =='i'
&& st[i + 5] == 'n' &&st[i +6] =='e' && st[i + 7] =='s' &&st[i + 8] =='s')
{cnt ++;flag = true;}
if(flag && cnt == 1){
u = i;w = i + 1;//自己和自己交换
}
if(flag && cnt == 2){
v = i + 1;//前一个happiness和后一个happiness交换
}
if(cnt == 3) break;
}
}
if(cnt == 0){
//对于原字符串中没有"happiness"子串的情况,比较简单的一个思路是,看字符串有没有相同字母。
//如果有,就交换不同位置的相同字母;如果没有,就可以随意交换。
cout <<"YES" << endl;
int v, x, y, sum =0;
bool f = false;//一直wa的原因,是因为判断条件把f写成了flag,严重失误!
//统计字符串是否含有相同字母
for(int i = 0; i < st.size(); i++){
a[st[i]-'a']++;
}
for(int i = 0; i < 26; i++){
if(a[i] >= 2){
v = i; f = true;break;
}
}
if(!f) cout <<"1 2" << endl;
else{
for(int i = 0; i < st.size(); i++){
if(st[i] == v + 'a' &&sum == 0){
sum ++; x= i; continue;
}
if(st[i] == v + 'a' &&sum == 1){
y = i; break;
}
}
cout << x + 1 <<" " << y + 1;
}
}
else if(cnt == 1){
cout <<"YES"<<endl; cout << u + 1 << " " << w +1;
}
else if(cnt == 2){
cout <<"YES" <<endl;cout <<u +1 <<" " << v + 1;
}
else cout <<"NO" <<endl;
return 0;
}
H - Perfect Ban 题目链接
Constantine and Mike are playing the board game «Wrath of Elves». There are n races and m classes of characters in this game. …
思路:暴力。先找出最大值的行和列,然后在此基础上去寻找次大值的行和列,然后再判断次次大值。
反思:变量定义有问题,不够清晰,导致写的很乱。刚结束,交上AC了。也算是一次独特的经历吧。