题目链接
https://codeforces.com/problemset/problem/1546/B
题外话:
哇,这真的是一道让人很无语的思维题。
比赛的时候没写出来,后来补题的时候,看了大佬的代码,然后以为自己懂了,好家伙,没想到自己没理解透。
今天在学校的练习题中又遇到了,决定好好理解理解这个题~
呜呜呜,以后一定好好补题!
题目大意
有2n-1个长度为m的字符串
其中有2n-2个字符串中可能某两个字符串之间,选出的某几个位置,交换了子字符串,让你找出那个没被交换过子字符串的字符串。
我的思路:
建立一个26行,m列的二维数组。
由题意可知,字符串的交换是按照下标的,但是无论如何交换,每个下表上对应的字母都应该是一定的。
所以由前m个字符串输入,统计每个位置上字符的数目,在输入m-1个字符串,相应位置的字符减去就好了。
(天呐,这一道思维题真的是让人很无语很无语)
我的代码:
#include <bits/stdc++.h>
using namespace std;
int b[30][100010];
int main()
{
int t, n, m, i, j;
cin >> t;
while (t--)
{
cin >> n >> m;
//初始化
for (i = 0; i < m; i++)
{
for (j = 0; j <= 26; j++)
b[j][i] = 0;
}
//输入
for (i = 1; i <= n; i++)
{
string a;
cin >> a;
for (j = 0; j < a.size(); j++)
{
b[a[j] - 'a'][j]++;
}
}
//减去
for (i = 1; i <= n - 1; i++)
{
string a;
cin >> a;
for (j = 0; j < a.size(); j++)
{
b[a[j] - 'a'][j]--;
}
}
//输出
for (i = 0; i < m; i++)
{
for (char j = 'a'; j <= 'z'; j++)
{
if (b[j - 'a'][i] != 0)
{
cout << j;
break;
}
}
}
cout << "\n";
}
return 0;
}