HDU - 4821(95/600)字符串水题
2017-08-16 18:16
387 查看
Given a string S and two integers L and M, we consider a substring of S as “recoverable” if and only if
(i) It is of length M*L;
(ii) It can be constructed by concatenating M “diversified” substrings of S, where each of these substrings has length L; two strings are considered as “diversified” if they don’t have the same character for every position.
Two substrings of S are considered as “different” if they are cut from different part of S. For example, string “aa” has 3 different substrings “aa”, “a” and “a”.
Your task is to calculate the number of different “recoverable” substrings of S.
Input
The input contains multiple test cases, proceeding to the End of File.
The first line of each test case has two space-separated integers M and L.
The second ine of each test case has a string S, which consists of only lowercase letters.
The length of S is not larger than 10^5, and 1 ≤ M * L ≤ the length of S.
Output
For each test case, output the answer in a single line.
Sample Input
3 3
abcabcbcaabc
Sample Output
2
随便哈希一下
(i) It is of length M*L;
(ii) It can be constructed by concatenating M “diversified” substrings of S, where each of these substrings has length L; two strings are considered as “diversified” if they don’t have the same character for every position.
Two substrings of S are considered as “different” if they are cut from different part of S. For example, string “aa” has 3 different substrings “aa”, “a” and “a”.
Your task is to calculate the number of different “recoverable” substrings of S.
Input
The input contains multiple test cases, proceeding to the End of File.
The first line of each test case has two space-separated integers M and L.
The second ine of each test case has a string S, which consists of only lowercase letters.
The length of S is not larger than 10^5, and 1 ≤ M * L ≤ the length of S.
Output
For each test case, output the answer in a single line.
Sample Input
3 3
abcabcbcaabc
Sample Output
2
随便哈希一下
#include<bits/stdc++.h> using namespace std; #define unsigned long long int int bs=233; int bte[100001],haxi[100001]; main() { bte[0]=1; for(int a=1;a<=100000;a++)bte[a]=bte[a-1]*bs; int n,m; string q; while(cin>>n>>m) { cin>>q; haxi[0]=0; memset(haxi,0,sizeof(haxi)); for(int a=0;a<q.size();a++)haxi[a+1]=haxi[a]*bs+q[a]; int dan=0; int cc=q.size(); for(int a=1;a<=m;a++) { map<int,int>mp; int er=0; for(int b=1,lj=1,sdk=1;a+b*m-1<=cc;b++,lj++) { int zs=haxi[a+b*m-1]-haxi[a+(b-1)*m-1]*bte[m]; // cout<<q[a+b*m-1-1]<<" "; if(mp[zs]==1)er++; mp[zs]++; if(lj<n)continue; if(er==0)dan++; int sdsd=haxi[a+sdk*m-1]-haxi[a+(sdk-1)*m-1]*bte[m]; sdk++; mp[sdsd]--; if(mp[sdsd]==1)er--; } // cout<<endl; } cout<<dan<<endl; } }
相关文章推荐
- The Hardest Problem Ever(hdu1048字符串水题)
- HDU 4821 String(字符串Hash)
- hdu 4821 String(字符串hash)
- HDU 1062 字符串翻转 (水题)
- HDU 4821 String 字符串hash map的妙用
- HDU 1228 A + B 字符串水题
- 【水题-字符串】HDU 1073 Online Judge
- hdu 4821 滑动窗口+字符串哈希
- [hdu 4821]String 字符串hash
- 【水题+字符串】杭电 hdu 1228 A + B
- hdu 4821 String(枚举 + 字符串hash)
- HDU 4821 String(字符串hash)
- hdu 4821 String(字符串hash+map)
- HDU 1020 Encoding 字符串 水题
- HDU 4821 String (字符串hash,技巧暴力)
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
- HDU 1266 Reverse Number(字符串逆转 水题)
- HDU 1736(字符串模拟的水题)
- HDU 4821 字符串hash
- HDU 4821 String 字符串hash(水