1 条题解

  • 1
    @ 2025-4-15 11:12:16

    枚举+哈希

    枚举

    因为l<=200,可以枚举字符不同的位置,记为i,再将每个数第i位去掉形成一个新的字符串。

    哈希

    如果暴力判断两两相同的字符,n方会超时。考虑将字符串哈希一下存到map里,每次ans += mp[t];

    坑点

    记得用unordered_map,用map会超时60分(亲测x_x)

    code

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    
    namespace syr
    {
    	const ll N = 3e4+10;
    	const ll L = 210;
    	const ull M = 13331;
    	char c;
    	ll n, l, k, ans;
    	ull a[N][L], f[N];
    	unordered_map <ull, ll> mp;
    	void work()
    	{
    		cin>>n>>l>>k;
    		f[0] = 1;
    		for (ll i=1; i<=n; i++) f[i]=f[i-1]*M;
    		for (ll i=1; i<=n; i++) {
    			for (ll j=1; j<=l; j++) {
    				cin>>c;
    				a[i][j] = a[i][j-1]*M+(c-'0'+1)*M;
    			}
    		}
    		for (ll i=1; i<=l; i++) { //不同的位置 
    			mp.clear();
    			for (ll j=1; j<=n; j++) {
    				ull t = a[j][i-1]*f[l-i]+a[j][l]-a[j][i]*f[l-i];
    				ans += mp[t];
    				mp[t]++;
    			}
    		}
    		cout<<ans;
    	}
    }
    
    int main()
    {
    	cin.tie(0)->sync_with_stdio(0);
    	syr::work();
    	return 0;
    }
    

    Ps:

    @提问:如何在Dev-C++中运行unordered_map

    • 工具[T] —— 编译选项[C] —— 编译器 —— (勾选)编译时加入以下命令 —— 输入-std=c++14

    完结散花!

    • 1

    信息

    ID
    157
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    40
    已通过
    12
    上传者