UVA - 11604 General Sultan

对每两个字符串进行匹配然后连边=看程序应该能看懂

开始st没清零不停地爆oj


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(j,k,l) for (int j=k;j<=l;++j)
#define M 25
#define N 110
#define P 250010

using namespace std;
int n,T,cnt,len[N],to[P][2],ne[P],st[N][M],used[N][M];
char s[N][M];
bool lych;

inline void add(int k1,int k2,int l1,int l2){
	
	to[++cnt][0]=l1;to[cnt][1]=l2;
	ne[cnt]=st[k1][k2];
	st[k1][k2]=cnt;
	
}

inline void init(){
	
	rep(i,1,n){
		
		scanf("%s%s",s[i]+1,s[i]+1);
		len[i]=strlen(s[i]+1);
		
	}
	cnt=0;
	memset(st,0,sizeof(st));
	rep(i,1,n) add(0,0,i,1);
	rep(k,1,n) rep(l,1,n) if (k!=l)
		rep(o,1,len[k]){
			
			int p=1;
			while (o+p-1<=len[k]&&p<=len[l]&&s[k][o+p-1]==s[l][p]) p++;
			if (o+p-1>len[k]){
				
				if (p>len[l]) add(k,o,n+1,0);
				else add(k,o,l,p);
				
			}else if (p>len[l]) add(k,o,k,o+p-1);
	
		}
	
}

inline void dfs(int k,int l){
	
	if (k==n+1){
		
		lych=1;
		return;
		
	}
	used[k][l]=T;
	for (int i=st[k][l];i;i=ne[i]){
		
		int o=to[i][0],p=to[i][1];
		if (used[o][p]!=T) dfs(o,p);
		if (lych) return;
		
	}
	
}

inline void work(){
	
	T++;
	lych=0;
	dfs(0,0);
	if (lych) printf("Case #%d: Ambiguous.\n",T);
	else printf("Case #%d: Not ambiguous.\n",T);
	
}

int main(){
	
	while (scanf("%d",&n)!=EOF&&n){
		
		init();
		work();
		
	}
	return 0;
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值