UVA 11604
2016-12-06 19:35
423 查看
题意:多组数据,每组给N个字符串(0,1组成),问是否可以构建一个字符串可以由N个字符串用不同方式组成(如可以由S1+S2或S1+S3+S4组成)?
思路:构图,把每个串中的每个字符都看成是一个点,通过字符串两两匹配连边,若其中一个字符串的开头可以连到终点,那么说明存在一种合理方案。
程序如下:
#include<cstdio>
#include<cstring>
using namespace std;
#define N 105
#define L 25
struct Node{
int v,next;
}e[N*N*L*L];
char s
[L];
bool ok;
int n,k,Id,E;
int head[N*L],vis[N*L],id
[L],len
;
void add(int u,int v) {e[Id].v=v;e[Id].next=head[u];head[u]=Id++;}
void dfs(int u)
{
vis[u]=1;
if (ok) return;
if (u==E) {ok=true;return;}
for (int i=head[u];~i;i=e[i].next)
{
if (!vis[e[i].v]) dfs(e[i].v);
if (ok) return;
}
}
int main()
{
for (int cas=1;;cas++)
{
scanf("%d",&n);
if (n==0) break;
memset(head,-1,sizeof(head));
k=1;Id=1;
for (int i=1;i<=n;i++)
{
scanf("%s%s",s[i]+1,s[i]+1);
len[i]=strlen(s[i]+1);
for (int j=1;j<=len[i];j++)
id[i][j]=k++;
}
E=k;
for (int i=1;i<=n;i++)
{
for (int h=1;h<=len[i];h++)
{
for (int j=1;j<=n;j++)
{
if (i==j&&h==1) continue;
for (k=1;k<=len[j]&&h+k-1<=len[i];k++)
if (s[i][h+k-1]!=s[j][k]) break;
if (h+k-1>len[i]&&k>len[j]) add(id[i][h],E);
else if (k>len[j]) add(id[i][h],id[i][k+h-1]);
else if (h+k-1>len[i]) add(id[i][h],id[j][k]);
}
}
}
memset(vis,0,sizeof(vis));
ok=false;
for (int i=1;i<=n;i++)
{
if (!vis[id[i][1]]) dfs(id[i][1]);
if (ok) break;
}
if (ok) printf("Case #%d: Ambiguous.\n",cas);
else printf("Case #%d: Not ambiguous.\n",cas);
}
return 0;
}
思路:构图,把每个串中的每个字符都看成是一个点,通过字符串两两匹配连边,若其中一个字符串的开头可以连到终点,那么说明存在一种合理方案。
程序如下:
#include<cstdio>
#include<cstring>
using namespace std;
#define N 105
#define L 25
struct Node{
int v,next;
}e[N*N*L*L];
char s
[L];
bool ok;
int n,k,Id,E;
int head[N*L],vis[N*L],id
[L],len
;
void add(int u,int v) {e[Id].v=v;e[Id].next=head[u];head[u]=Id++;}
void dfs(int u)
{
vis[u]=1;
if (ok) return;
if (u==E) {ok=true;return;}
for (int i=head[u];~i;i=e[i].next)
{
if (!vis[e[i].v]) dfs(e[i].v);
if (ok) return;
}
}
int main()
{
for (int cas=1;;cas++)
{
scanf("%d",&n);
if (n==0) break;
memset(head,-1,sizeof(head));
k=1;Id=1;
for (int i=1;i<=n;i++)
{
scanf("%s%s",s[i]+1,s[i]+1);
len[i]=strlen(s[i]+1);
for (int j=1;j<=len[i];j++)
id[i][j]=k++;
}
E=k;
for (int i=1;i<=n;i++)
{
for (int h=1;h<=len[i];h++)
{
for (int j=1;j<=n;j++)
{
if (i==j&&h==1) continue;
for (k=1;k<=len[j]&&h+k-1<=len[i];k++)
if (s[i][h+k-1]!=s[j][k]) break;
if (h+k-1>len[i]&&k>len[j]) add(id[i][h],E);
else if (k>len[j]) add(id[i][h],id[i][k+h-1]);
else if (h+k-1>len[i]) add(id[i][h],id[j][k]);
}
}
}
memset(vis,0,sizeof(vis));
ok=false;
for (int i=1;i<=n;i++)
{
if (!vis[id[i][1]]) dfs(id[i][1]);
if (ok) break;
}
if (ok) printf("Case #%d: Ambiguous.\n",cas);
else printf("Case #%d: Not ambiguous.\n",cas);
}
return 0;
}
相关文章推荐
- java线程
- 加速度计和陀螺仪数据融合
- [置顶] Spring原理(四)AOP的实现
- poj 1125 Stockbroker Grapevine Floyd(基础题)
- [置顶] RxJava 使用场景小结
- <C++>_函数重载
- JMeter学习-026-JMeter 分布式(远程)参数化测试实例
- 简易计算器
- Scikit-learn环境的搭建
- Redis的持久化机制
- win7装linux双系统
- 变量提升/函数提升
- 枚举类型enum用法
- DES 加密 解密算法
- 十四周项目二(1)
- 图标的旋转动画
- 播放一个数组中的动画
- 【BZOJ】4717 改装
- 并发知识与concurrent包
- 16哈理工新生赛 I 行编辑器 (模拟)