• 「BZOJ3555」[Ctsc2014] 企鹅QQ


    PenguinQQ是中国最大、最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志、群、即时通讯、相册、集市等丰富强大的互联网功能体验,满足用户对社交、资讯、娱乐、交易等多方面的需求。

    小Q是PenguinQQ网站的管理员,他最近在进行一项有趣的研究——哪些账户是同一个人注册的。经过长时间的分析,小Q发现同一个人注册的账户名称总是很相似的,例如Penguin1,Penguin2,Penguin3……于是小Q决定先对这种相似的情形进行统计。
    小Q定义,若两个账户名称是相似的,当且仅当这两个字符串等长且恰好只有一位不同。例如“Penguin1”和“Penguin2”是相似的,但“Penguin1”和“2Penguin”不是相似的。而小Q想知道,在给定的 个账户名称中,有多少对是相似的。
    为了简化你的工作,小Q给你的 个字符串长度均等于 ,且只包含大小写字母、数字、下划线以及‘@’共64种字符,而且不存在两个相同的账户名称。

    Input

    第一行包含三个正整数 , , 。其中 表示账户名称数量, 表示账户名称长度, 用来表示字符集规模大小,它的值只可能为2或64。
    若 等于2,账户名称中只包含字符‘0’和‘1’共2种字符;
    若 等于64,账户名称中可能包含大小写字母、数字、下划线以及‘@’共64种字符。
    随后 行,每行一个长度为 的字符串,用来描述一个账户名称。数据保证 个字符串是两两不同的。

    Output

    仅一行一个正整数,表示共有多少对相似的账户名称。

    Sample Input

    4 3 64
    Fax
    fax
    max
    mac
    Sample Output

    4

    Sol:枚举要删除哪一位,然后对字符串再进行重组并转成数字进行比较。复杂度都为O(Lnlogn)

    #include<bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ll;
    ll base = 131;
    char s[30030][205];
    ll S, ans, B[30030], H[30030][205], n, len, cnt, tmp[30030];
    void init()
    {
        B[0] = 1;
        for(int i=1; i<=len; i++) 
    	    B[i] = (B[i-1] * base);
        for(int i=1; i<=n; i++)
    	{
            for(int j=1; j<=len; j++)
    		{
                H[i][j] = (H[i][j-1] * base + s[i][j]);
            }
        }
    }
    int main()
    {
        cin >> n >> len >> S;
        for(int i=1; i<=n; i++){
        	
            cin >> s[i] + 1;
        }
        init();
        for(int j=1; j<=len; j++)//枚举被删除的那一位 
    	{
            for(int i=1; i<=n; i++)
    		{
                tmp[i] = H[i][j-1] * B[len-j] + H[i][len] - H[i][j] * B[len-j];
                //第i个单词,由[1..j-1]+[j+1..i]位所构成的单词 
            }
            
            sort(tmp+1, tmp+n+1);//进行排序 
            int sum = 1;
            for(int i=1; i<=n; i++)
    		{
                if(tmp[i] == tmp[i-1]) 
    			     ans += sum, sum ++;
                else 
    			     sum = 1;
            }
        }
        cout << ans;
        return 0;
    }
    

      

  • 相关阅读:
    归并排序(Merge Sort)
    AtCoder AGC035D Add and Remove (状压DP)
    AtCoder AGC034D Manhattan Max Matching (费用流)
    AtCoder AGC033F Adding Edges (图论)
    AtCoder AGC031F Walk on Graph (图论、数论)
    AtCoder AGC031E Snuke the Phantom Thief (费用流)
    AtCoder AGC029F Construction of a Tree (二分图匹配)
    AtCoder AGC029E Wandering TKHS
    AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
    AtCoder AGC035E Develop (DP、图论、计数)
  • 原文地址:https://www.cnblogs.com/cutemush/p/12315459.html
Copyright © 2020-2023  润新知