AC代码,先把没坏的键记录下来,然后剩下的就是可能是坏的键,应当输出。
#include<cstdio>
#include<cstring>
using namespace std;
int k;
char s[1010];
int notbroken[128],hashtable[128];
int p=0;
int main()
{
scanf("%d", &k);
scanf("%s", s);
int i = 0;
while (s[i]!=0)
{
int j = i+1;
while (s[j] ==s[i]){ j++;}
if ((j - i)%k!=0) notbroken[s[i]] = 1;//注意这里的判断条件应该为k的倍数
i = j;
}
int now = 0;
while (s[now] != 0)
{
if (notbroken[s[now]] == 1) now++;
else
{
if (hashtable[s[now]] == 0)
{
printf("%c", s[now]);
hashtable[s[now]] = 1;
}
now += k;
}
}
printf("\n");
int st = 0;
while (s[st]!=0)
{
printf("%c", s[st]);
if (notbroken[s[st]] != 1) st += k;
else st++;
}
printf("\n");
return 0;
}
以下是自己一开始的想法,但是最后一个测试点一直通不过,一直没有想清楚原因。
#include<cstdio>
#include<cstring>
using namespace std;
int k;
char s[1010];
int possible[128], impossible[128];//可能坏的与一定没坏的键
bool broken[128] = { 0 };
int p1=0, p2 = 0;
int main()
{
scanf("%d", &k);
scanf("%s", s);
int i = 0;
while (i < strlen(s))
{
int j = i+1;
while (s[j] ==s[i])
{
j++;
}
if ((j - i)%k==0) possible[p1++] = s[i];//注意这里的判断条件应该为k的倍数
else impossible[p2++] = s[i];
i = j;
}
for (int a = 0; a < p1; a++)
{
bool flag = 1;
for (int b = 0; b < p2; b++)
{
if (impossible[b] == possible[a])
{
flag = 0;
break;
}
}
if (flag == 1&&broken[possible[a]]==0)
{
printf("%c", possible[a]);
broken[possible[a]] = 1;
}
}
printf("\n");
int st = 0;
while (st < strlen(s))
{
printf("%c", s[st]);
if (broken[s[st]] == 1) st = st + k;
else st++;
}
return 0;
}