AT26 (iwi)

题面翻译

定义对称如下:

  1. 空串
  2. 一个字母’i’
  3. 一个字母’w’
  4. 在两个字母(‘i’或’w’)中包含一个对称的字符串,如"iwi",“wiw”,“ii”,“www”
  5. 在括号中包含一个对称的字符串,注意括号有两种形式,1、“()” 2、“)(”,即"(i)“和”)i("均为合法对称字符串

求最少进行几次更改操作,使一个字符串变为对称

输入

一个由’i’,‘w’,'(‘和’)'组成的字符串

输出

一个正整数,即最少更改次数

样例

输入1:

(iwi)

输出1:

0

说明1:

改串已为对称,不许更改

输入2:

ii(((((ww

输出2:

5

说明2:

可以更改成ww((i))ww,当然也有其他做法

数据范围

输入字符串的长度len<=10

原题/洛谷原题

解题

题目并不难,但容易错

错误代码1

#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
	if(a==b || a=='(' && b==')' || a==')' && b=='(') return 1;
	return 0;
}
int main(){
	cin>>n;
	l=n.size();
	s=(l+1)/2;
	k=s;
	for(int i=0;i<k;i++){
		if(hui(n[i],n[l-i-1]))
			s--;
	}
	cout<<s;
	return 0;
}

这个代码做错后,我去题解康了康,原来是 a = = b a==b a==b那错了
给你们看一个hack样例

输入: ( ( ( ( ( ( (((((( ((((((
正确输出: 3 3 3
这个输出: 0 0 0

你们可以试试…

错误代码2

#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
	if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
	return 0;
}
int main(){
	cin>>n;
	l=n.size();
	s=(l+1)/2;
	k=s;
	for(int i=0;i<k;i++){
		if(hui(n[i],n[l-i-1]))
			s--;
	}
	cout<<s;
	return 0;
}

这个代码我找了2分钟才找到错误,大家可以找找看…
————————————————————————————分界线
忘了这个代码是歪国题,最后没输出换行 ’~’
然后改好后就AC啦!

AC代码1

#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
	if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
	//上面代码为核心,判断是否对称
	return 0;
}
int main(){
	cin>>n;
	l=n.size();
	s=(l+1)/2;//最多改一边的字符,所以折半
	k=s;
	for(int i=0;i<k;i++){
		if(hui(n[i],n[l-i-1]))//这里对n字符串进行对称比较
			s--;//有对称就少一个修改
	}
	cout<<s<<"\n";
	return 0;
}

AC代码2

#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
	if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
	//上面代码为核心,判断是否对称
	return 0;
}
int main(){
	cin>>n;
	l=n.size();
	s=0;//最少改0个,所以从0
	k=(l+1)/2;
	for(int i=0;i<k;i++){
		if(hui(n[i],n[l-i-1])==0)//这里对n字符串进行对称比较,也可以写为~!hui(n[i],n[l-i-1])~
			s++;//无对称就多一个修改
	}
	cout<<s<<"\n";
	return 0;
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值