CodeForces 596E
来源:互联网 发布:淘宝怎么取消开店认证 编辑:程序博客网 时间:2024/05/19 22:06
每个位置都有一个字母,沿着一条路,路上的字母可以要或者不要,可以得到一个字符串
问题是给定字符串,判断是否存在一条路径可以得到这个字符串
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=210;const int NN=1e6+10;char ss[N][N];char tt[NN];int dir[21][2];int vis[N][N];int n,m,q;int check(int i,int j){ if(i<0||i>=n||j<0||j>=m)return 0; return 1;}int dp[N][N];int ans[N*N];int is[N*N];int dfs(int x,int y){ int zi=ss[x][y]-'0'; int cir=vis[x][y]; if(dp[x][y]!=-1)return dp[x][y]; if(is[cir])return dp[x][y]=ans[cir]; int xx=x+dir[zi][0],yy=y+dir[zi][1]; dfs(xx,yy); int j=dp[xx][yy]-1; if(j<0||tt[j]-'0'!=zi){ j++; } dp[x][y]=j; return dp[x][y];}int du[N][N];int sta[N*N],top;int getx(char ch){ return ch-'0';}int main(){ #ifdef DouBi freopen("in.cpp","r",stdin); #endif // DouBi while(scanf("%d%d%d",&n,&m,&q)!=EOF){ for(int i=0;i<n;i++){ scanf("%s",ss[i]); } for(int i=0;i<10;i++){ scanf("%d%d",&dir[i][0],&dir[i][1]); } int cnt=0; memset(vis,0,sizeof(vis)); memset(du,0,sizeof(du)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int zi=ss[i][j]-'0'; int ii=i+dir[zi][0],jj=j+dir[zi][1]; if(check(ii,jj)){ du[ii][jj]++; } } } top=0; memset(is,0,sizeof(is)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++)if(!vis[i][j]){ int x=i,y=j; cnt++; int tmp=0; int st,ed; while(check(x,y)&&!vis[x][y]){ vis[x][y]=cnt; int zi=ss[x][y]-'0'; tmp|=1<<zi; st=x,ed=y; x+=dir[zi][0],y+=dir[zi][1]; } if(check(x,y)&&vis[x][y]==vis[i][j]){ is[cnt]=tmp; sta[top++]=cnt; } else if(check(x,y)==0){ cnt++; vis[st][ed]=cnt; int zi=ss[st][ed]-'0'; is[cnt]=1<<zi; sta[top++]=cnt; } } } while(q--){ scanf("%s",tt); int n1=strlen(tt); int flag=0; for(int i=0;i<top;i++){ int a=sta[i]; int b=is[a]; int k=0; for(int j=n1-1;j>=0;j--){ if((b&(1<<getx(tt[j])))==0){ k=j+1;break; } } ans[a]=k; if(k==0){ flag=1;break; } } memset(dp,-1,sizeof(dp)); for(int i=0;i<n&&!flag;i++){ for(int j=0;j<m&&!flag;j++)if(du[i][j]==0&&dp[i][j]==-1){ dfs(i,j); if(dp[i][j]==0){ flag=1;break; } } } if(flag){ printf("YES\n"); } else printf("NO\n"); } } return 0;}
0 0
- CodeForces 596E
- codeforces 596E Wilbur and Strings(DFS)
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- Codeforces 124 E
- Codeforces 231E
- Codeforces 231E - Cactus
- Codeforces #163 Div2 E
- codeForces 35E
- Codeforces 35E
- Playlist codeforces 268E
- Codeforces 148E(Porcelain)
- codeforces round#177 E
- codeforces 203E Transportation
- CodeForces 254 E Dormitory
- codeforces日记371e
- 矩阵分块与矩阵乘法的理解
- 【时间复杂度】【贪心】最大新整数
- C语言中内存分配方式
- Android Studio插件之MVPHelper,一键生成MVP代码
- c语言关键字const
- CodeForces 596E
- windows下文件路径太深,无法删除解决办法
- asterisk目录结构
- 循环删除数组中的元素
- 深入理解黑客攻击-改变程序的返回地址
- iOS - 解决the behavior of the UICollectionViewFlowLayout is not defined
- 关于使用BufferedWriter时没有数据 写入问题,和换行问题
- 自定义一个ListView实现聊天界面
- apk打包签名