P4503-[CTSC2014]企鹅QQ【字符串hash】
生活随笔
收集整理的這篇文章主要介紹了
P4503-[CTSC2014]企鹅QQ【字符串hash】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意
給出nnn個長度為lll且互不相同的串,若兩個串只有一個字符不相同那么這兩個串相似。
求有多少對相似的串。
解題思路
我們可以枚舉不相似的位,然后我們考慮字符串hashhashhash
然后我們可以將刪掉了一位的字符串拆分為由[1..k?1][1..k-1][1..k?1]和[k+1..l][k+1..l][k+1..l]組成的字符串。
我們先正著求一遍hashhashhash定為hashihash_ihashi?,然后倒著求一遍hashhashhash定為dhashidhash_idhashi?。
然后刪除第kkk位之后的hashhashhash值為hashk+dhashk?pkhash_k+dhash_k*p^khashk?+dhashk??pk
然后排序統計即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ull unsigned long long using namespace std; const int N=30100,L=210; const ull p=13331; ull hash[N],hash1[N][L],hash2[N][L],pow; int n,l,ans; char s[N][L]; void work(int k) {for(int i=1;i<=n;i++)hash[i]=hash1[i][k-1]+hash2[i][k+1]*pow;sort(hash+1,hash+1+n);hash[n+1]=23333333;int num=0;for(int i=1;i<=n;i++){num++;if(hash[i]!=hash[i+1])ans+=num*(num-1)/2,num=0;} } int main() {scanf("%d%d%d",&n,&l,&pow);for(int i=1;i<=n;i++){scanf("%s",s[i]+1);for(int j=1;j<=l;j++)hash1[i][j]=hash1[i][j-1]*p+s[i][j];for(int j=l;j>=1;j--)hash2[i][j]=hash2[i][j+1]*p+s[i][j];}pow=1;for(int i=1;i<=l;i++)pow*=p,work(i);printf("%d",ans); }總結
以上是生活随笔為你收集整理的P4503-[CTSC2014]企鹅QQ【字符串hash】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迪迦奥特曼宿那鬼是第几集 宿那鬼是什么东
- 下一篇: 苹果第四财季营收连续第四个季度下滑 净利