RE 50 pts 求助
  • 板块P1127 词链
  • 楼主方123456
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/11/24 22:25
  • 上次更新2023/11/5 07:23:32
查看原帖
RE 50 pts 求助
128754
方123456楼主2020/11/24 22:25

谢谢点进来 debug。 RT

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF=2005;
int n,num[111],_sub[111][INF],len[INF],fa_set[INF],in[INF],last[INF];
string ch[INF],ans[INF]; bool vis[INF],flag,vis1[INF];
int find_set(int xx) {
        return xx==fa_set[xx] ? xx : fa_set[xx]=find_set(fa_set[xx]);
}
void DFS(int x,int sum) {
        // cout<<x<<" "<<sum<<" "<<last[x]<<" "<<num[x]<<"\n";
        if (flag) return;
        if (sum==n) {flag=true; return;}
        for (int i=last[x]; i<=num[x]; i++) {
                if (vis1[_sub[x][i]]) continue; vis1[_sub[x][i]]=true;
                ans[sum+1]=ch[_sub[x][i]]; last[x]=i+1;
                DFS(ch[_sub[x][i]][len[_sub[x][i]]-1]-'a',sum+1);
                if (flag) return;
        }
        return;
}
signed main()
{
        ios::sync_with_stdio(false);
        cin>>n;
        for (int i=0; i<26; i++) fa_set[i]=i,last[i]=1;
        for (int i=1; i<=n; i++) {
                cin>>ch[i];
                len[i]=ch[i].size();
                in[ch[i][0]-'a']++;
                in[ch[i][len[i]-1]-'a']++;
                vis[ch[i][0]-'a']=true;
                fa_set[find_set(ch[i][0]-'a')]=find_set(ch[i][len[i]-1]-'a');
        }
        sort(ch+1,ch+1+n);
        for (int i=1; i<=n; i++) _sub[ch[i][0]-'a'][++num[ch[i][0]-'a']]=i;
        int cnt=0,Min=1e9;
        for (int i=0; i<26; i++) {
                if (in[i]&1) {
                        cnt++;
                        Min=min(Min,i);
                }
        }
        if (cnt==1 || cnt>2) {cout<<"***\n"; return 0;}
        int fa=-1;
        for (int i=1; i<=n; i++) {
                if (!vis[ch[i][0]-'a']) continue;
                if (fa!=-1 && fa!=find_set(ch[i][0]-'a')) {cout<<"***\n"; return 0;}
                else fa=find_set(ch[i][0]-'a');
        }
        for (int i=0; i<26; i++)
                if (vis[i]) {
                        // cout<<i<<"\n";
                        DFS(i,0);
                        if (flag) break;
                        for (int j=0; j<26; j++) last[j]=1;
                        for (int j=1; j<=n; j++) vis1[j]=0;
                }
        // if (!flag) {cout<<"***\n"; return 0;}
        for (int i=1; i<=n; i++) if (i!=n) cout<<ans[i]<<"."; else cout<<ans[i];
        return 0;
}

2020/11/24 22:25
加载中...