codeforces 527b Error Correct System
2015-08-06 00:49
429 查看
题意:两个长度相同的字符串,最多给一次交换某一字符串两位置字母的机会,求出可得的两字符串的最小码距(即最少能有多少不相同的位置)
题解:因为最多进行一次交换,也就是说对于存在多种满足同样要求的交换情况,输出一组即可,即可以把多种情况压缩处理,只留最先遍历得到的两个不同对应字母的位置,这样的话只需要一个26*26的数组即可,保证不会发生超时。
下面需要对一下情况进行讨论
1.未交换之前码距为1。。。直接按要求输出即可;
2.未交换之前码距不为1,若有两个位置可在变化之后同时保证上下相同,则码距为原码距-2;
3.未交换之前码距不为1,(2)不成立且有两个位置变化之后能够保证有一个位置不再有码距,则码距为原码距-1;
4.以上都不成立,按需输出;
题解:因为最多进行一次交换,也就是说对于存在多种满足同样要求的交换情况,输出一组即可,即可以把多种情况压缩处理,只留最先遍历得到的两个不同对应字母的位置,这样的话只需要一个26*26的数组即可,保证不会发生超时。
下面需要对一下情况进行讨论
1.未交换之前码距为1。。。直接按要求输出即可;
2.未交换之前码距不为1,若有两个位置可在变化之后同时保证上下相同,则码距为原码距-2;
3.未交换之前码距不为1,(2)不成立且有两个位置变化之后能够保证有一个位置不再有码距,则码距为原码距-1;
4.以上都不成立,按需输出;
#include <iostream> #include<cstdio> #include<cstring> using namespace std; char a1[200010]; char a2[200010]; long note[28][28]; int main() { long x,i,j,k; while(scanf("%ld",&x)!=EOF){ scanf("%s%s",a1,a2); long num=0,res; memset(note,0,sizeof(note)); for(i=0;i<x;i++){ if(a1[i]!=a2[i]){ note[a1[i]+1-'a'][a2[i]+1-'a']=i+1; num++; } } int flag=0; long ans1,ans2; if(num<=1){ ans1=-1; ans2=-1; res=num; } else { for(i=1;i<=26;i++){ for(j=i+1;j<=26;j++){ if(note[i][j]&¬e[j][i]) { ans1=note[i][j]; ans2=note[j][i]; flag=1; res=num-2; break; } } if(flag) break; } if(flag==0){ for(i=1;i<=26;i++){ for(j=1;j<=26;j++){ if(note[i][j]) { for(k=1;k<=26;k++){ if(note[k][i]) { ans2=note[k][i]; flag=1; res=num-1; ans1=note[i][j]; break; } } } } } } if(flag==0){ for(i=1;i<=26;i++){ for(j=1;j<=26;j++){ if(note[i][j]) { for(k=1;k<=26;k++){ if(note[j][k]){ ans2=note[j][k]; flag=1; res=num-1; ans1=note[i][j]; break; } } } } } } long a[2]; int hh=0; if(flag==0) { for(i=1;i<=26;i++){ for(j=1;j<=26;j++){ if(note[i][j]) a[hh++]=note[i][j]; if(hh>=2) { flag=1; res=num; break; } } if(flag) break; } if(flag) { ans1=a[0]; ans2=a[1]; } } if(flag==0) {ans1=-1; ans2=-1; res=num; } } if(ans1>ans2) swap(ans1,ans2); printf("%ld\n%ld %ld\n",res,ans1,ans2); } return 0; }
相关文章推荐
- Linux路由配置
- iOS-设置启动图片
- BZOJ2213 : [Poi2011]Difference
- python+opencv
- 概率论与统计学的重要东西
- python+opencv
- Rails中select2 实现多选框的效果
- Leetcode# 92 Reverse Linked List II
- 2015-08-05
- Java基础-Exception
- java学习笔记——构造方法
- BestCoder Round #49 Three Palindromes 即 hdu5340 (manacher算法)
- Leetcode #206 Reverse Linked List
- Android多种方式实现自定义Dialog对话框
- iOS中—触摸事件详解及使用
- ExtJS 创建Window实例二
- DHCP 服务器架设
- Rails Jquery datepicker 使用教程
- Linux中查找文件的常见命令
- python的Error集,17个新手常见Python运行时错误