标签:p2 Educational Rated int 题补后 cnt ++ p1 字符串
A题朴素dp:
从小往大判断那些个数可以取得
B题贪心:
有血就打,没血回城
C题思维:
相同大小盒子重复出现次数记录下来,最多的那个的次数就是答案
D题前缀和+计数:
简单的推公式,坑点是爆longlong,用long double。
F题字符串思维题:
针对第一个字符串进行枚举,方式为将其中两个字符交换,然后和其他字符串比较计算汉明长度,应该都满足等于2,或者等于0的同时字符串中有两个以上的地方是相同字符(这样就可以在交换一次后不改变汉明长度)。具体按以下步骤来就行了。
1.判断所有字符串含有的每个字符的个数是否相等,不等就肯定无解
2. 拿第一个字符串和其他字符串都比对一边,记录字符串中相同位置元素不同的个数如果出现不同元素个数等于1或大于4的情况那么一定无解
3. 对第一个字符串上枚举两个位置做交换,然后这个字符串和其它各字符串的不同元素数如果都满足以下两个条件中任意一个就找到解(比较的时候不要整个字符串都比一遍,技巧看代码)
1)不同个数为2
2)不同个数为0且字符串中存在两个元素相等
4. 在第3步中没有合适的就无解了
char s[2505][5005]; int num0[26], num1[26]; int diff[2505]; int main(){ int k = read(), n = read(); bool flag = false; // 是否有两个位置元素相同 for(int i = 0; i < k; i++) scanf("%s", s[i]); for(int i = 0; i < n; i++) if(++num0[s[0][i] - 'a'] == 2) flag = true; for(int i = 1; i < k; i++){ for(int j = 0; j < n; j++) num1[s[i][j] - 'a']++; for(int j = 0; j < 26; j++){ if(num0[j] != num1[j]) {puts("-1"); return 0;} else num1[j] = 0; } } for(int i = 1; i < k; i++){ for(int j = 0; j < n; j++){ if(s[0][j] != s[i][j]) diff[i]++; } if(diff[i] == 1 || diff[i] > 4) {puts("-1"); return 0;} } for(int p1 = 0; p1 < n; p1++){ for(int p2 = p1 + 1; p2 < n; p2++){ bool flag1 = true; for(int i = 1; i < k; i++){ int cnt = diff[i]; cnt -= (s[0][p1] == s[i][p2]); cnt -= (s[0][p2] == s[i][p1]); cnt += (s[0][p1] == s[i][p1]); cnt += (s[0][p2] == s[i][p2]); if(!(cnt == 2 || cnt == 0 && flag)){ flag1 = false; break; } } if(flag1){ swap(s[0][p1], s[0][p2]); cout << s[0] << endl; return 0; } } } puts("-1"); return 0; }
标签:p2,Educational,Rated,int,题补后,cnt,++,p1,字符串 来源: https://www.cnblogs.com/ACHappy-yjy/p/12960526.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。