字符串处理 Codeforces Round #296 (Div. 2) B. Error Correct System

 

题目传送门

 1 /*  2  无算法  3  三种可能:1.交换一对后正好都相同,此时-2  4  2.上面的情况不可能,交换一对后只有一个相同,此时-1  5  3.以上都不符合,则不交换,-1 -1  6  7 */  8 #include <cstdio>  9 #include <iostream>  10 #include <algorithm>  11 #include <cmath>  12 #include <cstring>  13 #include <string>  14 #include <map>  15 #include <set>  16 #include <vector>  17 #include <set>  18 using namespace std;  19  20 const int MAXN = 2e5 + 10;  21 const int INF = 0x3f3f3f3f;  22  23 char s[MAXN], t[MAXN];  24 int p[30][30];  25  26 bool check1(int cnt)  27 {  28 for (int i=0; i<26; ++i)  29  {  30 for (int j=0; j<26; ++j)  31  {  32 if (p[i][j] && p[j][i])  33  {  34 printf ("%d\n", cnt-2);  35 printf ("%d %d\n", p[i][j], p[j][i]);  36 return true;  37  }  38  }  39  }  40  41 return false;  42 }  43  44 bool check2(int cnt)  45 {  46 for (int i=0; i<26; ++i)  47  {  48 for (int j=0; j<26; ++j)  49  {  50 if (p[i][j])  51  {  52 for (int k=0; k<26; ++k)  53  {  54 if (p[k][i])  55  {  56 printf ("%d\n", cnt-1);  57 printf ("%d %d\n", p[i][j], p[k][i]);  58 return true;  59  }  60  }  61  }  62  }  63  }  64  65 return false;  66 }  67  68 void work(int n)  69 {  70 int cnt = 0;  71 for (int i=0; i<n; ++i)  72  {  73 if (s[i] != t[i])  74  {  75 p[s[i]-'a'][t[i]-'a'] = i + 1;  76 cnt++;  77  }  78  }  79 if (check1 (cnt)) return ;  80 if (check2 (cnt)) return ;  81  82 printf ("%d\n", cnt);  83 puts ("-1 -1");  84 }  85  86 int main(void)  87 {  88 //freopen ("B.in", "r", stdin);  89  90 int n;  91 while (~scanf ("%d", &n))  92  {  93 memset (p, 0, sizeof (p));  94 scanf ("%s", &s);  95 scanf ("%s", &t);  96  97  work (n);  98  }  99 100 return 0; 101 }

 

你可能感兴趣的:(codeforces)