考虑从$(1,1)$开始搜索移动方案,每次移动坐标的变化量都是$2$。

如果构成了环,那么环的周长肯定是偶数。

考虑这个环一定要被若干个骨牌覆盖,且还有一个位置是空的。

所以得出环的周长是奇数,矛盾,因此这个搜索不会搜出环,从而会得到一棵有根树。

那么答案就是所有关键点加上根节点形成的虚树的边总长$\times 2-$离根最远的关键点到根的距离,DP即可。

时间复杂度$O(nm)$。

#include<cstdio>
const int N=75,M=1230;
char s[N],a[N][N];
int n,m,cnt,i,j,x,y,z,ans,id[N][N],is[M],g[M],nxt[M],v[M],f[M];
inline bool check(char x){return x=='a'||x=='e'||x=='i'||x=='o'||x=='u'||x=='y';}
void dfs(int x,int y,int z,int u){
if(x<1||x>n||y<1||y>m)return;
int o=id[x][y];
v[o]=1;
if(u)nxt[o]=g[u],g[u]=o;
if(z!=2&&a[x][y+1]=='-')dfs(x,y+2,1,o);
if(z!=1&&a[x][y-1]=='-')dfs(x,y-2,2,o);
if(z!=4&&a[x+1][y]=='|')dfs(x+2,y,3,o);
if(z!=3&&a[x-1][y]=='|')dfs(x-2,y,4,o);
}
void dp(int x){
for(int i=g[x];i;i=nxt[i]){
dp(i);is[x]+=is[i];
if(is[i]){
ans+=2;
if(f[i]>=f[x])f[x]=f[i]+1;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i+=2)for(j=1;j<=m;j+=2)id[i][j]=++cnt;
for(i=1;i<=n;i++)for(scanf("%s",s+1),j=1;j<=m;j++)is[id[i][j]]|=check(s[j]);
for(i=1;i<=n;i++)scanf("%s",a[i]+1);
dfs(1,1,0,0);
for(i=0;i<=cnt;i++)if(is[i]&&!v[i])return puts("NIE"),0;
dp(1);
return printf("%d",ans-f[1]),0;
}

  

BZOJ2990 : [Ontak2010]Keyboard的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Fedora 22中的Locale and Keyboard Configuration

    Introduction The system locale specifies the language settings of system services and user interface ...

  3. android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

    <activity android:name="xxxActivity" android:configChanges="keyboard|keyboardHidde ...

  4. USB Keyboard Recorder

    catalogue . 引言 . Device Class Definition for Human Interface Devices (HID) . USB HID Report Descript ...

  5. imx6 matrix keyboard

    imx6需要添加4x4的矩阵键盘.本文记录添加方法. 参考链接 http://processors.wiki.ti.com/index.php/TI-Android-JB-PortingGuide h ...

  6. Codeforces Round #389 Div.2 B. Santa Claus and Keyboard Check

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. UVa 11998 Broken Keyboard (数组模拟链表问题)

    题目链接: 传送门 Broken Keyboard #include<bits/stdc++.h> using namespace std; char str[100010]; int m ...

  8. vimium Keyboard Bindings

    Modifier keys are specified as `<c-x>`, `<m-x>`, and `<a-x>` for ctrl+x, meta+x, a ...

  9. UVa 11988 Broken Keyboard(链表->数组实现)

    /*数组形式描述链表:链表不一定要用指针. 题目链接:UVa 11988 Broken Keyboard 题目大意: 小明没有开屏幕输入一个字符串,电脑键盘出现了问题会不定时的录入 home end ...

随机推荐

  1. 利用drozer进行Android渗透测试

    一.安装与启动 1. 安装 第一步:从 http://mwr.to/drozer 下载Drozer (Windows Installer) 第二步:在 Android 设备中安装 agent.apk ...

  2. CLR via C#(06)- 构造器

    最近忙着看新还珠,好几天不学习了.玩物丧志啊,罪过罪过. 今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有提高. 对于构造器,大家应该都不陌生,它主要是用 ...

  3. Java内存泄露的理解与解决

    依赖于引用判断的内存管理机制 Java中对内存对象的访问,使用的是引用的方式.在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间.在Ja ...

  4. C# 设计模式 提高可维护性的几点原则

    为了提高软件的可维护性,应该遵循以下几点原则: 1.“开放--封闭”原则(OCP) 一个软件实体应该对扩展开放,对修改封闭. 2.里氏代换原则(LSP) 子类型必须能替换她们的基类型,反过来则不成立. ...

  5. Gmail 账号找回办法

    前段时间一直在用GFW代理,结果发现GOOGLE账户的保护机制起用了,要给以前的手机号发消息,结果哪个号现在不用了,所以就登陆不进去了,非常扯淡,索性谷歌了下,得出如下的解决方案,完美解决,下次直接在 ...

  6. C#路径/文件/目录/I/O常见操作汇总

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  7. MyEclipse 关闭鼠标悬停提示

    preference --> MyEclipse -->Files and Editors--> Common Editor Preference --> Hovers 把里面 ...

  8. 使用pl/sql監控PROCEDURE執行時間

    創建表 CREATE TABLE PROCESS_TIMING_LOG (   PROCESS_NAME       VARCHAR2(50 BYTE),   EXECUTION_DATE     D ...

  9. Oracle性能优化之SQL语句

    1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  10. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...