首页 技术 正文
技术 2022年11月12日
0 收藏 689 点赞 4,843 浏览 1680 个字

题目来自Codeforce 1141Dhttp://codeforces.com/problemset/problem/1141/D

因为是全英文题面,就先简单的阐述一下题面。

首先输入一个数n,然后输入两个长度为n的字符串,我们需要做的就是对两个字符串的每个字符从1到n编号,然后对两个字符串的所有字符进行一对一的匹配,如果两个字符串中有字符相同,则匹配成功,输出两个字符的对应编号,其中?可以和任意字符匹配,问最多能匹配多少个字符,输出最优解。

解题思路

这个题如果直接遍历不用说,肯定超时,但是像我这种菜鸡其他的也不会,所以我也是遍历,但是可以说一种优化过的遍历。

首先我用的是结构体来存这两个字符串,这样的话可以保证字符在排序之后也可以和它的编号对应,然后就是对这两个字符串进行从大到小的排序,这样就把?全部放到了最后,只要对前面的字母先对应匹配,再来处理?,就会省不少时间,并且因为前面的字母都是已经排过序的,匹配起来也非常好处理,多余的操作很少,速度自然也就快了。其中我还用了两个bool数组分别对应两个字符串的所有字符,一旦某一个字符被匹配过之后,就利用bool数组对其进行标记,减少后面的处理步骤。cun数组就是用来存放对应的编号的。

完整代码

#include<iostream>
#include<algorithm>
using namespace std;
struct stu
{
int num;
char str;
};
stu a[],b[];
int cun[][];
bool cmp(stu n,stu m)
{
return n.str>m.str;
}
bool str1[],str2[];
int main()
{
int i,j,k=;
int n,sum=;
cin>>n;
for(i=;i<=n;i++)
{
cin>>a[i].str;
a[i].num=i;
}
for(i=;i<=n;i++)
{
cin>>b[i].str;
b[i].num=i;
}
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp);
i=;
j=;
while()
{
if(a[i].str=='?'||b[j].str=='?'||i>n||j>n)
break;
if(a[i].str==b[j].str)
{
sum++;
cun[sum][]=a[i].num;
cun[sum][]=b[j].num;
str1[a[i].num]=true;
str2[b[j].num]=true;
i++;
j++;
}
else if(a[i].str>b[j].str)
{
while(i<=n)
{
i++;
if(a[i].str<=b[j].str)
break;
}
}
else if(a[i].str<b[j].str)
{
while(j<=n)
{
j++;
if(a[i].str>=b[j].str)
break;
}
}
}
//cout<<i<<" "<<j<<endl;
while(i<=n&&k<=n)
{
if(str2[b[k].num])
{
k++;
continue;
}
if(a[i].str=='?'&&!str1[a[i].num])
{
sum++;
cun[sum][]=a[i].num;
cun[sum][]=b[k].num;
str2[b[k].num]=true;
str1[a[i].num]=true;
k++;
}
i++;
//cout<<i<<" "<<k<<endl;
}
k=; while(j<=n&&k<=n)
{
if(str1[a[k].num])
{
k++;
continue;
}
if(b[j].str=='?'&&!str2[b[j].num])
{
sum++;
cun[sum][]=a[k].num;
cun[sum][]=b[j].num;
str1[a[k].num]=true;
str2[b[j].num]=true;
k++;
}
j++;
//cout<<j<<" "<<k<<endl;
}
cout<<sum<<endl;
for(k=;k<=sum;k++)
cout<<cun[k][]<<" "<<cun[k][]<<endl;
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295