题解 模拟赛 【image】
模拟赛 【image】
题目大意:


solution:
大暴力,但由于我把复杂度算错了,使用了一点技巧(似乎算?)。
我的做法是这样的,每次匹配时,我随机选取几个点来判断(\(\text{NOI D2T1}\)后遗症)(随机化没有前途),如果都相等,再暴力判断。
后来想了一下,这个做法在一些情况下甚至会出现负优化[捂脸]。
My code
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
const int N=55;
char a[N][N],b[N][N];
int R;
int main(){
int T; scanf("%d",&T);
while(T--){
srand(time(0));
int n,m; scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
for(int i=1;i<=m;i++)
scanf("%s",b[i]+1);
if(m>n){
puts("No");
continue;
}
R=m*m/10;
bool sec=0;
for(int i=1;i<=n-m+1;i++){//+1!!!
for(int j=1;j<=n-m+1;j++){
bool flag=0;
for(int k=1;k<=R;k++){
int x=rand()%m,y=rand()%m;
int p=x+i,q=y+j;
if(a[p][q]!=b[x+1][y+1]){
flag=1;
break;
}
}
if(!flag){
bool flag2=0;
for(int p=1;p<=m;p++){
for(int q=1;q<=m;q++){
if(a[i+p-1][j+q-1]!=b[p][q]){
flag2=1;
break;
}
}
if(flag2) break;
}
if(!flag2){
puts("Yes");
sec=1;
break;
}
}
}
if(sec) break;
}
if(!sec){
puts("No");
}
}
return 0;
}
真简洁[赞]
std
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void work()
{
int n,m;
cin>>n>>m;
string a[n],b[m];
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
bool f=0;
for(int i=0;i<=n-m;i++){
for(int j=0;j<=n-m;j++){
bool ff=1;
for(int k=0;k<m;k++)
for(int l=0;l<m;l++)
ff&=a[i+k][j+l]==b[k][l];
f|=ff;
}
}
cout<<(f?"Yes":"No")<<endl;
}
int main(){
freopen("image.in","r",stdin) ;
freopen("image.out","w",stdout) ;
int t;
cin>>t;
while (t--)
work();
return 0;
}

浙公网安备 33010602011771号