zoukankan      html  css  js  c++  java
  • BZOJ3806: Neerc2011 Dictionary Size

    题解:

    这题搞得我真是酸(dan)爽(teng)

    原来一直不会,一定会用到什么神奇的东西。因为重复的不知道如何计算。

    今天中午睡起来忽然想到好像可以在正trie上故意走无出边,因为这样就保证了这次统计的所有字符串在它的孩子都不会再次被统计到。

    然后感觉这题就解了。

    然后和别人的程序对拍发现居然一直少计算了什么!去多了?

    然后发现没有算上trie上的节点,前面只考虑了在trie后面加字符串。。。

    然后发现好像正反都得特判,然后发现又有重复的!!!这怎么搞!!!

    感觉AC无望便去颓了两集火影。。。

    看完了乱搞了一下居然就A了。。。我真的是乱搞的T_T现在还不知道为什么能A。。。

    int n,m,tot,a[maxn][26],s[2][26];
    char st[10001][45];
    bool b[26];
    int main()
    {
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        n=read();
        for1(k,n)
        {
            scanf("%s",st[k]);m=strlen(st[k]);
            int now=0;
            for0(i,m-1)
            {
                int j=st[k][i]-'a';
                if(!a[now][j])a[now][j]=++tot,s[0][j]--;
                now=a[now][j];
            }
            b[(int)(st[k][m-1]-'a')]=1;
        }
        for0(i,25)s[0][i]+=tot;
        ll ans=0;
        for0(i,tot)for0(j,25)if(a[i][j]&&b[j])ans++;
        memset(b,0,sizeof(b));
        memset(a,0,sizeof(a));tot=0;
        for1(k,n)
        {
            int now=0;m=strlen(st[k]);
            for3(i,m-1,0)
            {
                int j=st[k][i]-'a';
                if(!a[now][j])a[now][j]=++tot,s[1][j]++;
                now=a[now][j];
            }
            b[(int)(st[k][0]-'a')]=1;
        }
        for1(i,tot)for0(j,25)if(a[i][j]&&b[j])ans++;
        memset(b,0,sizeof(b));
        for1(i,n)if(strlen(st[i])==1)b[(int)(st[i][0]-'a')]=1;
        for0(i,25)ans+=b[i];
        for0(i,25)ans+=(ll)s[0][i]*s[1][i];
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    查询长事务和SQL执行等待间隔时间
    一条诡异的SQL
    查询表的使用空间和可用空间
    查询SQL Server存储过程的执行信息
    清理大批量数据例子
    sql server 清理日志存储过程
    BCP 实例
    SQL Server 查询Job中的存储过程
    下车扫描五次优化全过程
    empty、isset和is_null的比较
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4246754.html
Copyright © 2011-2022 走看看