CodeForces
来源:互联网 发布:淘宝达人登录网址 编辑:程序博客网 时间:2024/06/07 08:42
题解:用vis[]a[i][b[i]]记录一下a和b两个错误的字母的位置判断是否有没有vis[b[i]][a[i]]]存在如果有就换过去汉明距离-2肯定是最优的如果没有就查看b串上面是否有位置不与a匹配并且等于a[i]即可
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<set>#include<vector>#include<queue>#include<stack>#include<map>using namespace std;#define rep(a,b) for(int i = a; i <= b; i++)#define dec(a,b) for(int i = a; i >= b; i--)#define root 1,1,n#define ls 2*rt#define rs 2*rt+1#define mid (L+R)/2#define lson ls,L,mid#define rson rs,mid+1,R#define fi first#define se second#define mes(a) memset(a,0,sizeof(a))typedef long long int ll;const int mx = 1e6+5;char a[mx];char b[mx];int vis[300][300];int mark[mx];int main(){int n;memset(vis,-1,sizeof(vis));memset(mark,-1,sizeof(mark));scanf("%d",&n);scanf("%s",a);scanf("%s",b);int sum = 0;for(int i = 0; i < n; i++)if(a[i]!=b[i]){sum++;vis[a[i]][b[i]] = i;mark[a[i]] = i;}int ans = sum;int x = -1,y = -1;for(int i = 0; i < n; i++)if(a[i]!=b[i]){if(vis[b[i]][a[i]]!=-1){printf("%d\n",sum-2);printf("%d %d\n",i+1,vis[b[i]][a[i]]+1);return 0;}else if(mark[b[i]]!=-1){ans = min(ans,sum-1);x = i+1,y = mark[b[i]]+1;}}printf("%d\n",ans);printf("%d %d\n",x,y);return 0;}
阅读全文