题意:给你两个字符串,问你如何交换前面那个字符串最多两个字母,使得两个字符串差异最小(相同位置不想等为差异)。
解题思路:如果交 换2个 使得差异 -2 ,就有点类似于 置换群(mp[i][j] != 0 && mp[j][i] !=0) ,差异 -1 只需要记录不匹配的位置就行。
解题代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月18日 星期三 00时52分28秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 200005 26 using namespace std; 27 char str1[maxn]; 28 char str2[maxn]; 29 int dp[30][30]; 30 int hs[30]; 31 int main(){ 32 int n ; 33 scanf("%d",&n); 34 scanf("%s %s",&str1[1],&str2[1]); 35 int sum = 0 ; 36 for(int i = 1;i <= n;i ++) 37 { 38 if(str1[i] != str2[i]) 39 { 40 dp[str1[i] - 'a'][str2[i]-'a'] = i ; 41 sum ++ ; 42 hs[str1[i] - 'a'] = i ; 43 } 44 } 45 for(int i = 0;i < 26 ;i ++) 46 { 47 for(int j = 0 ;j < 26; j ++) 48 { 49 if(dp[i][j] != 0 && dp[j][i] != 0 ) 50 { 51 printf("%d\n%d %d\n",sum-2,dp[i][j],dp[j][i]); 52 return 0 ; 53 } 54 } 55 } 56 for(int i = 0 ;i < 26;i ++) 57 for(int j = 0 ;j < 26;j ++) 58 { 59 if(dp[i][j] != 0 && hs[j] != 0 ) 60 { 61 printf("%d\n%d %d\n",sum-1,dp[i][j],hs[j]); 62 return 0 ; 63 } 64 } 65 printf("%d\n-1 -1\n",sum); 66 return 0; 67 }
没有梦想,何谈远方