https://codeforces.com/contest/1360/problem/F
这题直接拿s[1]枚举每一位改成哪个字母就行了就行了。。。。m*26*n*m的复杂度
结果我硬是想成了dfs还纠结了半天wa了两发
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=300;
int n,m,ans,cas,k;
int a[maxl][maxl];
vector <int> b[maxl];
char s[maxl][maxl],ch[maxl],tmp[maxl];
bool in[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
for(int j=1;j<=m;j++)
{
b[j].clear();
for(int i=0;i<26;i++)
a[j][i]=0;
}
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
for(int j=1;j<=m;j++)
a[j][s[i][j]-'a']++;
}
}
inline void jug()
{
int cnt;
for(int i=1;i<=n;i++)
{
cnt=0;
for(int j=1;j<=m;j++)
if(s[i][j]!=tmp[j])
cnt++;
if(cnt>1)
return;
}
ans=1;
}
inline void dfs(int k)
{
if(ans) return;
for(int d:b[k])
{
tmp[k]='a'+d;
if(k==m)
jug();
else
dfs(k+1);
if(ans) return;
tmp[k]=0;
}
}
inline void mainwork()
{
int cnt,tot=0,mx,id;
for(int j=1;j<=m;j++)
{
cnt=0;mx=0,id=0;
for(int i=0;i<26;i++)
if(a[j][i]>0)
{
cnt++,b[j].push_back(i);
if(mx<a[j][i])
mx=a[j][i],id=i;
}
ch[j]=id+'a';
}
ans=0;
for(int i=1;i<=n;i++)
{
cnt=0;
for(int j=1;j<=m;j++)
if(s[i][j]!=ch[j])
cnt++;
if(cnt>2)
return;
}
dfs(1);
}
inline void print()
{
if(!ans)
puts("-1");
else
{
for(int i=1;i<=m;i++)
printf("%c",tmp[i]);
puts("");
}
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}
本文解析了Codeforces竞赛中的一道题目,采用DFS算法进行解答,并提供了完整的C++代码实现。通过枚举和深度优先搜索策略,解决了字符串匹配问题,确保了在m*26*n*m的时间复杂度下找到最优解。
338

被折叠的 条评论
为什么被折叠?



