65,189
社区成员




#include<stdio.h>
#include<string.h>
int howmany (char* s)
{
long long b = 0,bi = 0,bin = 0, bing = 0;
unsigned int i=0
for (; i < strlen(s); i++)
{
switch (*(s+i))
{
case 'b':
b++;
break;
case 'i':
bi+= b;
break;
case 'n':
bin+= bi;
break;
case 'g':
bing+= bin;
break;
}
}
return (int)(bing%1000000007);
}
使用逆推的思想,在遍历过程中,当出现'g'的时候,当前已经出现的"bin"和这个'g'都可以组成"bing",那么"bing"的个数也就增加"bin"的个数;同理“bin”和“bi”的个数也这么算,O(n)算出结果。[quote=引用 38 楼 q745401990 的回复:] [quote=引用 36 楼 longteng1116 的回复:] 通过了,可惜第一次挑战失败了,用了一个马甲提交挑战成功。最后怎么评奖呢?
[quote=引用 54 楼 aa512690069 的回复:]这个是我提交的。
这个是我提交的。
int howmany (const char* s) { unsigned int len = 0; const char* e = s; const char* key = "bing"; const char* ke = key; unsigned int keyLen = 0; long long num = 0; long long* bing = 0; int idx[256] = {0}; unsigned int i = 0; if(s == 0 || *s == 0) return 0; while(*ke++ != 0); while(*++e != 0); keyLen = ke - key - 1; bing = (long long*)malloc(sizeof(long long) * keyLen); for(i = 0; i < keyLen; ++i) { idx[key[i]] = i + 1; bing[i] = 0; } for (--e; e >= s; --e) { int n = idx[*(unsigned char*)e]; if(!n) continue; if(n == keyLen) { bing[n - 1]++; } else { if(bing[n] > 0) bing[n - 1] += bing[n]; } } num = bing[0]; free(bing); return num % 1000000007; }
int howmany (const char* s)
{
unsigned int len = 0;
const char* e = s;
const char* key = "bing";
const char* ke = key;
unsigned int keyLen = 0;
long long num = 0;
long long* bing = 0;
int idx[256] = {0};
unsigned int i = 0;
if(s == 0 || *s == 0) return 0;
while(*ke++ != 0);
while(*++e != 0);
keyLen = ke - key - 1;
bing = (long long*)malloc(sizeof(long long) * keyLen);
for(i = 0; i < keyLen; ++i)
{
idx[key[i]] = i + 1;
bing[i] = 0;
}
for (--e; e >= s; --e)
{
int n = idx[*(unsigned char*)e];
if(!n)
continue;
if(n == keyLen)
{
bing[n - 1]++;
}
else
{
if(bing[n] > 0)
bing[n - 1] += bing[n];
}
}
num = bing[0];
free(bing);
return num % 1000000007;
}