2018 ICPC 南京 M题 Mediocre String Problem ——Gym - 101981M

https://blog.csdn.net/KXL5180/article/details/90142634

http://fastvj.rainng.com/problem/Gym-101981M

http://codeforces.com/gym/101981/attachments

继上一篇文章关于南京M题的做法,这次我有学习了字符串hash有写了一个字符串hash的做法

做法:第一步还是和上次一样用马拉车算法预处理回文串,得到s的以左端点为起点的字符串的个数。

然后对s串哈希,然后在对,t串反转在哈希,最后枚举s串中和t串末尾相同的字符的位置,然后二分LCP长度,然后

ans+=length*sum[i];就可以了

思路和上一次的差不多,唯一不同的就是LCP的求法改变了

时间复杂度是O(nlogn),但不过常数比后缀数组小多了,如果hash的姿势够帅是不会超时的。

#include
using namespace std;
typedef long long ll;
const int N=2e6+10;
const ll p=13131;
const ll mod=1e9+7;
char s[N],t[N],s_new[N];
int d[N],pos[N];
int init()
{
    int len=strlen(s);
    s_new[0]='$';
    s_new[1]='#';
    int j=2;
    for(int i=0;i>1;
            if(ok(mid,i+1,t_len))
                cnt=mid,l=mid+1;
            else
                r=mid-1;
        }
        ans+=1LL*cnt*d[i+2];
    }
    printf("%lld\n",ans);
    return 0;
}

 

你可能感兴趣的:(ACM题解,字符串)