1 条题解

  • 0
    @ 2024-10-8 11:24:46

    解题思路: 一、列出全部m长度的子串、排序、去重计数。时间复杂度是没问题的,先不管空间复杂度,不做优化直接上三部曲代码,核心部分只有三行(用系统提供的substr和sort),以下代码可拿70分,最后30分空间超了。

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,ans=1;
    string h[200002],str;
    int main(){
    	cin>>n>>m>>str;
    	for(int i=0;i<n-m+1;i++) h[i]=str.substr(i,m);//列子串
    	sort(h,h+n-m+1);//排序
    	for(int i=1;i<n-m+1;i++) if(h[i]!=h[i-1]) ans++;//去重计数
    	cout<<ans;
    }
    

    二、保存全部子串太费空间,优化一下,改为存hash值(用系统提供的hash模板),100分到手!

    #include <bits/stdc++.h>
    using namespace std;
    long long n,m,ans=1,h[200002];
    hash<string> hs;
    string str;
    int main(){
    	cin>>n>>m>>str;
    	for(int i=0;i<n-m+1;i++) h[i]=hs(str.substr(i,m));//列子串
    	sort(h,h+n-m+1);//排序
    	for(int i=1;i<n-m+1;i++) if(h[i]!=h[i-1]) ans++;//去重计数
    	cout<<ans;
    }
    

    三、后话。如果考试给的数据比较容易冲突,单哈希可能拿不到满分,那就上双哈希吧。

    • @ 2024-10-8 11:45:41

      最后的最后,想偷懒,可以用上系统给的set模板,不用自己排序去重。什么都用系统给的,练习时不建议,但考试时如果对手搓哈希、快排没信心的话可以考虑这方法,核心代码压成一行:

      #include <bits/stdc++.h>
      using namespace std;
      int n,m;
      hash<string> hs;
      set<long long> s;
      string str;
      int main(){
      	cin>>n>>m>>str;
      	for(int i=0;i<n-m+1;i++) s.insert(hs(str.substr(i,m)));
      	cout<<s.size();
      }
      
  • 1

信息

ID
2671
时间
1000ms
内存
256MiB
难度
8
标签
递交数
111
已通过
13
上传者