题意:
给一个01串s,统计其中长度从A到B的各个子串出现的次数,输出频率最高的N个
十分朴素且无脑地过了...还很快
对于A到B的每个长度len,取出s中所有该长度的串,转化为二进制x,++cnt[len][x],
再作为node放到ans数组中,node有三个成员,val, len, cnt(值,长度,出现次数)
对ans排序,再输出即可
再就是,输入输出稍微注意一点
AC代码如下:
/*
PROB:contact
LANG:C++
ID:fan_0111
*/
#include <cstdio>
#include <algorithm>
struct node { int len, cnt, val; }ans[10010];
bool cmp(node a, node b) {
if (a.cnt == b.cnt) {
if (a.len == b.len) return a.val < b.val;
return a.len < b.len;
}
return a.cnt > b.cnt;
}
int cnt[13][10010];
char ch[200020];
void print(int len, int x) {
// printf("\n%d %d\n", len, x);
char ret[len + 1] = "";
ret[len] = '\0';
int i = len - 1;
while (x) {
ret[i--] = x % 2 + '0';
x /= 2;
}
for (int j = i; j >= 0; --j) ret[j] = '0';
printf("%s", ret);
}
using namespace std;
int main() {
freopen("contact.in", "r", stdin);
freopen("contact.out", "w", stdout);
int a, b, n;
scanf("%d%d%d\n", &a, &b, &n);
int len = 0;
while (scanf("%c", &ch[len]) != EOF) {
if (ch[len] == '\n') continue;
++len;
}
b = len < b ? len : b;
// printf("%c\n", ch[0]);
// printf("%d