求助!为啥把链接表换成vector就只有30pts了?
  • 板块P1127 词链
  • 楼主legohu
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/8 20:24
  • 上次更新2023/11/4 18:22:32
查看原帖
求助!为啥把链接表换成vector就只有30pts了?
117360
legohu楼主2021/7/8 20:24

(为了查询错误,我竟然沦落到一行行对AC代码的地步了)然而,尽管思路相同,为啥一个vector会如此伤人?改了四行AC就拜拜了……恳求大佬相助。

链接表->相对的100pts

#include <bits/stdc++.h>
using namespace std;
const int N=1010,inf=1<<29;
int n,len[N],sta[N],cnt[30],top=0;
int head[N],to[N*N],next1[N*N],en;//改
bool flag=false,vis[N];
string s[N];
void dfs(int u)
{
    if (flag) return ;
    sta[top++]=u;
    vis[u]=true;
    int v;
    for (int i=head[u];i;i=next1[i])//改
    {
        v=to[i];
        if (!vis[v]) dfs(v);
    }
    if (top==n) flag=true;
    else vis[u]=false,--top;
}
void add_edge(int u,int v){
    to[++en]=v,next1[en]=head[u],head[u]=en;
}
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>s[i];
    sort(s+1,s+n+1);
    for (int i=1;i<=n;i++)
        len[i]=s[i].size();
    for (int i=1;i<=n;i++)
        for (int j=n;j>=1;j--)
        if (i!=j && s[i][len[i]-1]==s[j][0])
        add_edge(i,j);//改
    for (int i=1;i<=n;i++)
        cnt[s[i][0]-'a']++,cnt[s[i][len[i]-1]-'a']--;
    int k=0,h;
    for (int i=0;i<26;i++){
        if (cnt[i]==1) k++,h=i;
        if (cnt[i]==2) k=2;
        if (k==2) break;
    }
    if (k==2) cout<<"***\n";
    else if (k==1){
        for (int i=1;i<=n;i++)
            if (s[i][0]-'a'==h)
            dfs(i);
    }
    else {
        for (int i=1;i<=n;i++)
            dfs(i);
    }
    if (!flag) {
        cout<<"***\n";
        return 0;
    }
    cout<<s[sta[0]];
    for (int i=1;i<top;i++)
        cout<<'.'<<s[sta[i]];
    cout<<endl;
    return 0;
}

vector->30pts

#include <bits/stdc++.h>
using namespace std;
const int N=1010,inf=1<<29;
int n,len[N],sta[N],cnt[30],top=0;
vector<int> a[N];//不同处
bool flag=false,vis[N];
string s[N];
void dfs(int u)
{
    if (flag) return ;
    sta[top++]=u;
    vis[u]=true;
    int v;
    for (int i=0;i<a[u].size();i++)//不同处
    {
        v=a[u][i];
        if (!vis[v]) dfs(v);
    }
    if (top==n) flag=true;
    else vis[u]=false,--top;
}
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>s[i];
    sort(s+1,s+n+1);
    for (int i=1;i<=n;i++)
        len[i]=s[i].size();
    for (int i=1;i<=n;i++)
        for (int j=n;j>=1;j--)
        if (i!=j && s[i][len[i]-1]==s[j][0])
        a[i].push_back(j);//不同处
    for (int i=1;i<=n;i++)
        cnt[s[i][0]-'a']++,cnt[s[i][len[i]-1]-'a']--;
    int k=0,h;
    for (int i=0;i<26;i++){
        if (cnt[i]==1) k++,h=i;
        if (cnt[i]==2) k=2;
        if (k==2) break;
    }
    if (k==2) cout<<"***\n";
    else if (k==1){
        for (int i=1;i<=n;i++)
            if (s[i][0]-'a'==h)
            dfs(i);
    }
    else {
        for (int i=1;i<=n;i++)
            dfs(i);
    }
    if (!flag) {
        cout<<"***\n";
        return 0;
    }
    cout<<s[sta[0]];
    for (int i=1;i<top;i++)
        cout<<'.'<<s[sta[i]];
    cout<<endl;
    return 0;
}
2021/7/8 20:24
加载中...