http://acm.hdu.edu.cn/showproblem.php?pid=2369
题意:给出一个字符串,求出含有n个不同字母且长度最长的长度。
比赛时脑残的以为是DP,想了很久。。愣是没发现字符串长度1million。直接模拟,设置一个st,记录从st开始的最长的长度,长度大于n时,就要从st开始删除直到含有n个不同字母为止。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char s[1000010];
int vis[310];
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
getchar();
gets(s);
int len = strlen(s);
int st = 0;
int i,j;
int num = 0;
int ans = -1;
memset(vis,0,sizeof(vis));
for(i = 0; i < len; i++)
{
j = s[i];
if(!vis[j])
{
num++; //不同字母数加1
}
vis[j]++;
while(num > n) //当num大于n时,要从st开始删除直到含有n个不同字母为止
{
j = s[st];
if(vis[j] == 1)
num--;
vis[j]--;
st++;
}
ans = max(ans,i-st+1);
}
printf("%d\n",ans);
}
return 0;
}