日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P4503-[CTSC2014]企鹅QQ【字符串hash】

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。