1001 字符串“水”题(二进制,map,哈希)
生活随笔
收集整理的這篇文章主要介紹了
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,哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象类和接口有什么区别?
- 下一篇: codevs 1200:同余方程