社区讨论

爆拼67pts,第二个测试点没整明白,求指点

P1019[NOIP 2000 提高组] 单词接龙(疑似错题)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo1henz6
此快照首次捕获于
2023/10/22 21:05
2 年前
此快照最后确认于
2023/11/02 21:40
2 年前
查看原帖
测试点二
Input
CPP
2
abababab
abababc
a

Output
CPP
19

CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
int n,ans = 0,t;char c;string w,tmp,tmp1;
string word[N];int vis[N];
bool pd(string a,string b) {
    if(a.size() != b.size() && (a.find(b) == 0 || b.find(a) == 0)) return false;
    tmp = a,tmp1 = b;
    if(a == b) {
        return a[a.size() - 1] == a[0];
    }else {
        while(b.find(tmp)) {
            tmp = tmp.substr(1);
        }

        // while(a.find(tmp1)) {
        //     tmp1 = tmp1.substr(1);
        // }
        
        return tmp.size();
    }
    
}

string concatStr(string a,string b) {
    tmp = a,tmp1 = b;
    int cnt = 0,cnt1 = 0;
    if(a == b) {
        for(int i = a.size() - 1,j = 0;i >= 0 && j < a.size();i--,j++) {
            if(a[i] == b[j]) cnt++;
            else break;
        }

        if(cnt) return tmp.substr(0,a.size() - cnt) + b;
        else return a + b;
    }else {
        while(b.find(tmp)) {
            tmp = tmp.substr(1);
            cnt++;
        }

        // while(a.find(tmp1)) {
        //     tmp1 = tmp1.substr(1);
        //     cnt1++;
        // }

        return a.substr(0,cnt) + b;

        // return max(a.substr(0,cnt) + b,b.substr(0,cnt1) + a);
    }
    
}

void dfs(int u,string s) {
    if(u >= 1) {
        t = s.size();
        ans = max(ans,t);
        // cout << s << endl;
    }
    
    for(int i = 1;i <= 2 * n;i++) {
        if(!vis[i] && pd(s,word[i])) {
            vis[i] = 1;
            dfs(u + 1,concatStr(s,word[i]));
            vis[i] = 0;
        }
    }
}

int main(){
    cin >> n;
    for(int i = 1;i <= n;i++) {
        cin >> w;
        word[i] = word[i + n] = w; 
    }
    cin >> c;
    
    for(int i = 1;i <= 2 * n;i++) {
        if(word[i].find(c) == 0) {
            memset(vis,0,sizeof(vis));
            vis[i] = 1;
            dfs(1,word[i]);
        }
    }

    cout << ans << endl;
    
    return 0;
}   

回复

3 条回复,欢迎继续交流。

正在加载回复...