2 条题解

  • 2
    @ 2023-5-2 11:48:35
    #include<algorithm> //包含了【unique()】函数。
    #include<cstring> //包含了【substr()】、【length()】函数。
    #include<stack>
    using namespace std;
    int n,num(0),ans(0);
    string i[100001];
    stack <string> h;
    bool Can(string s1,string s2) //判断。
    {
        if (s1==s2||s1.length()>s2.length())
          return false;
        return s1==s2.substr(0,s1.length()); //从s2[0]到s2[s1.length]的子串。
    }
    void Make_can(string s) //努力试图加入此元素。
    {
        while (h.size()&&!Can(h.top(),s))
        {
            h.pop();
            num--;
        }
        h.push(s);
        num++;
    }
    int main()
    {
        cin>>n;
        for (int a=1;a<=n;a++)
          cin>>i[a];
        sort(i+1,i+n+1); //救人的字典序。
        n=unique(i+1,i+n+1)-(i+1); //排序相邻去重,并返回整型末位置数字。
        for (int a=1;a<=n;a++)
          if (h.empty()||Can(h.top(),i[a])) //队空就入,判断队头是否为i[a]的前缀。
          {
              h.push(i[a]); //是就入队并更新答案。
              ans=max(ans,++num);
          }
          else
            Make_can(i[a]);
        cout<<ans;
        return 0;
    }
    
    • @ 2024-4-5 14:28:48

      #include<bits/stdc++.h> using namespace std; int n,num(0),ans(0); string i[100001]; stack <string> h; bool Can(string s1,string s2) //判断。 { if (s1s2||s1.length()>s2.length()) return false; return s1s2.substr(0,s1.length()); //从s2[0]到s2[s1.length]的子串。 } void Make_can(string s) //努力试图加入此元素。 { while (h.size()&&!Can(h.top(),s)) { h.pop(); num--; } h.push(s); num++; } int main() { cin>>n; for (int a=1;a<=n;a++) cin>>i[a]; sort(i+1,i+n+1); //救人的字典序。 n=unique(i+1,i+n+1)-(i+1); //排序相邻去重,并返回整型末位置数字。 for (int a=1;a<=n;a++) if (h.empty()||Can(h.top(),i[a])) //队空就入,判断队头是否为i[a]的前缀。 { h.push(i[a]); //是就入队并更新答案。 ans=max(ans,++num); } else Make_can(i[a]); cout<<ans; return 0; }

  • 0
    @ 2023-7-5 7:50:15

    n < 105 1e5

    • 1

    信息

    ID
    759
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    63
    已通过
    12
    上传者