Tonylin1203 2025-05-22 21:43 采纳率: 66.7%
浏览 5
已结题

最短前缀C++为啥会报错?


#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,cnt[10001],a[1001];
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<n;i++)
    {
        string t="";
        for(int j=0;j<a[i].size();j++)
        {
            t+=a[i][j];
            cnt[t]++;
        }
    }
    for(int i=0;i<n;i++)
    {
        string t="";
        for(int j=0;j<a[i].size();j++)
        {
            t+=a[i][j];
            if(cnt[t]==1||j==a[i].size()-1)
            {
                cout<<a[i]<<" "<<t<<endl;;
            }
        }
    }
    return 0;
}

为啥会报错?
题目:最短前缀

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-22 21:46
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    C++最短前缀程序错误分析

    问题分析

    你提供的代码试图解决"最短前缀"问题,但存在几个关键错误:

    1. 数组类型不匹配:a被声明为int数组,但后面却尝试调用a[i].size()a[i][j],这显然是错误的
    2. cnt数组用于统计字符串前缀出现次数,但a数组是整数类型,无法直接获取字符串操作
    3. 缺少必要的头文件(虽然bits/stdc++.h包含了大多数)

    修正后的代码

    #include <bits/stdc++.h>
    using namespace std;
    
    
    int main() {
        int n;
        cin >> n;
        vector<string> words(n);  // 使用字符串数组存储输入
        unordered_map<string, int> prefixCount;  // 使用哈希表统计前缀出现次数
    
    
        // 读取输入
        for (int i = 0; i < n; i++) {
            cin >> words[i];
        }
    
    
        // 统计所有单词的所有前缀出现次数
        for (const auto& word : words) {
            string prefix;
            for (char c : word) {
                prefix += c;
                prefixCount[prefix]++;
            }
        }
    
    
        // 为每个单词寻找最短唯一前缀
        for (const auto& word : words) {
            string prefix;
            for (char c : word) {
                prefix += c;
                if (prefixCount[prefix] == 1 || prefix == word) {
                    cout << word << " " << prefix << endl;
                    break;
                }
            }
        }
    
    
        return 0;
    }
    

    主要修改点

    1. a数组改为vector<string>类型,存储字符串而非整数
    2. 使用unordered_map替代固定大小的cnt数组,更安全且动态
    3. 简化了循环结构,使用范围for循环提高可读性
    4. 修正了前缀匹配逻辑,确保当整个单词作为前缀时才输出

    程序逻辑

    开始

    这个程序首先统计所有单词的所有可能前缀出现的次数,然后为每个单词找到最短的、在输入中唯一的前缀。如果整个单词作为前缀都不唯一,则输出整个单词作为前缀。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 已采纳回答 5月22日
  • 创建了问题 5月22日