您的位置:首页 > 其它

UVA10129 Play on Words【思路】

2017-09-04 14:30 330 查看
题意:能不能把所有字符串,首尾相连接起来

思路:首先做一个粗略的判断,看看所有收尾的字母能不能连到一起,并查集。收尾相连,最多有一个出度比入度大1的字母和入度比出度大1的字母,并且只有这两个字母的入度、出度不同;还有种情况就是所有的字母入度、出度都相同

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1005;
char s[maxn];
int in[maxn],out[maxn];
int pre[maxn],vis[maxn];

void init(int n)
{
for(int i = 1; i <= n; i++)
pre[i] = i;
}

int fid(int x)
{
if(pre[x] == x)
return x;
else
return pre[x] = fid(pre[x]);
}

void he(int x,int y)
{
int nx = fid(x);
int ny = fid(y);
if(nx != ny)
pre[nx] = ny;
}

int main(void)
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(in,0,sizeof in);
memset(out,0,sizeof out);
memset(vis,0,sizeof vis);
for(int i = 0; i < 26; i++)
pre[i] = i;
for(int i = 1; i <= n; i++)
{
scanf("%s",s);
in[s[0]-'a']++;
int len = strlen(s);
out[s[len-1]-'a']++;
he(s[len-1]-'a',s[0]-'a');
vis[s[0]-'a'] = 1;
vis[s[len-1]-'a'] = 1;
}
int flag = 0;
for(int i = 0; i < 26; i++)
{
if(vis[i] && pre[i] == i)
flag++;
}
if(flag != 1)
flag = 0;
int num = 0,num1 = 0,num2 = 0;
for(int i = 0; i < 26; i++)
{
if(in[i] != out[i])
num++;
if(in[i] == out[i] + 1)
num1++;
if(out[i] == in[i] + 1)
num2++;
}
if(num == 0 || (num==2 && num1==1 && num2==1))
;
else
flag = 0;
if(flag)
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: