1 条题解

  • 0
    @ 2025-4-5 11:41:06

    单哈希

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    string s[10005]; 
    
    const int BASE = 31;
    const int MOD = 1000000007;
    int hash1[10005];
    
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>s[i];
    	//生成每个字符串的哈希值
    	for(int i=1;i<=n;i++){
    		//s[i] -> hash[i]
    		hash1[i] = 0;
    		for(int j=0;j<s[i].size();j++)
    			hash1[i] = (hash1[i]*BASE+s[i][j])%MOD;
    	} 
    	//暴力比较
    	int ans = 0;
    	for(int i=1;i<=n;i++)
    	{
    		bool flag = true;//初始认为 s[i] 没有出现过
    		for(int j=1;j<i;j++)
    		{
    			if(hash1[i]==hash1[j])
    			{
    				flag=false;
    				break;
    			}	
    		}	
    		if(flag)
    			ans++;
    	} 
    	cout<<ans<<"\n";
    	return 0;
    }
    

    自然溢出哈希

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    string s[10005]; 
    
    const int BASE = 31;
    unsigned long long hash1[10005];
    
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>s[i];
    	//生成每个字符串的哈希值
    	for(int i=1;i<=n;i++){
    		//s[i] -> hash[i]
    		hash1[i] = 0;
    		for(int j=0;j<s[i].size();j++)
    			hash1[i] = hash1[i]*BASE+s[i][j];
    	} 
    	//暴力比较
    	int ans = 0;
    	for(int i=1;i<=n;i++)
    	{
    		bool flag = true;//初始认为 s[i] 没有出现过
    		for(int j=1;j<i;j++)
    		{
    			if(hash1[i]==hash1[j])
    			{
    				flag=false;
    				break;
    			}	
    		}	
    		if(flag)
    			ans++;
    	} 
    	cout<<ans<<"\n";
    	return 0;
    }
    

    双哈希

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n;
    string s[10005]; 
    
    const int P1 = 31;
    const int MOD1 = 1000000007;
    int hash1[10005];
    
    const int P2 = 29;
    const int MOD2 = 998244353;
    int hash2[10005];
    
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>s[i];
    	//生成每个字符串的哈希值
    	for(int i=1;i<=n;i++){
    		//s[i] -> hash[i]
    		hash1[i] = 0;
    		hash2[i] = 0;
    		for(int j=0;j<s[i].size();j++)
    		{
    			hash1[i] = (hash1[i] * P1 + s[i][j])%MOD1;
    			hash2[i] = (hash2[i] * P2 + s[i][j])%MOD2;
    		}
    	} 
    	
    	//暴力比较
    	int ans = 0;
    	for(int i=1;i<=n;i++)
    	{
    		bool flag = true;//初始认为 s[i] 没有出现过
    		for(int j=1;j<i;j++)
    		{
    			if(hash1[i]==hash1[j]&&hash2[i]==hash2[j])
    			{
    				flag=false;
    				break;
    			}	
    		}	
    		if(flag)
    			ans++;
    	} 
    	cout<<ans<<"\n";
    	return 0;
    }
    
    • 1

    信息

    ID
    1355
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    41
    已通过
    16
    上传者