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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

1001 字符串“水”题(二进制,map,哈希)

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1001 字符串“水”题(二进制,map,哈希) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1001: 字符串“水”題

時間限制:?1 Sec??內存限制:?128 MB
提交:?210??解決:?39
[提交][狀態][討論版]

題目描述

給出一個長度為 n 的字符串(1<=n<=100000),求有多少個連續字串中所有的字母都出現了偶數次。?

輸入

第一行一個正整數 T,表示數據組數(1 <= T <= 10)。?
接下來 T 行,每行有一個只包含小寫字母的字符串。?

輸出

每個答案輸出滿足要求字符串個數。每個答案占一行。

樣例輸入

3 a aabbcc abcabc

樣例輸出

0 6 1

提示

?

?

這道題挺不錯的,

用二進制的低0-25位分別保存'a'-'z'出現的次數,然后根據相同狀態統計,

見代碼,

1 #include <bits/stdc++.h> 2 using namespace std; 3 map<int,int>mmap; 4 char str[100010]; 5 int main () 6 { 7 int T; 8 scanf("%d",&T); 9 while(T--) { 10 mmap.clear(); 11 scanf("%s",str); 12 int len = strlen(str); 13 int state=0; 14 long long sum=0; 15 for(int i=0; i<len; i++) { 16 state^=(1<<(str[i]-'a')); 17 if(state==0) { 18 sum++; 19 } 20 sum+=mmap[state]; 21 mmap[state]++;//相同狀態出現次數 22 } 23 printf("%lld\n",sum); 24 } 25 return 0; 26 }

?

后來可能數據加強了,上面代碼超時了。

優化一下,先哈希然后存map,

1 #include <bits/stdc++.h> 2 #define maxn 34567 3 4 using namespace std; 5 typedef long long LL; 6 7 char str[110000]; 8 map<int,int>sk[maxn]; 9 void solve() 10 { 11 for(int i=0;i<maxn;i++) 12 sk[i].clear(); 13 int len=strlen(str); 14 int ret=0; 15 LL ans=0; 16 sk[0][0]=1; 17 for(int i=0; i<len; i++) 18 { 19 int now=str[i]-'a'; 20 ret^=(1<<now); 21 ans+=sk[ret%maxn][ret]; 22 sk[ret%maxn][ret]++; 23 } 24 printf("%lld\n",ans); 25 } 26 27 int main() 28 { 29 int T; 30 scanf("%d%*c",&T); 31 while(T--) 32 { 33 scanf("%s",str); 34 solve(); 35 } 36 return 0; 37 } View Code

?

轉載于:https://www.cnblogs.com/bofengyu/p/6790545.html

總結

以上是生活随笔為你收集整理的1001 字符串“水”题(二进制,map,哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。

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