HDU 2369(类似MAX SUM的DP)
凡是留上星不会做的 我都要做。。。这是俺单纯的人生目标~~~
先分析这道题目 求含有n个不同字母的最大串长度~~
实现就只好用hash了 哈哈 以下是代码 附加注释
#include <iostream>
using namespace std;
char key[1100000];
long hash[256];
int main()
{
long n;
while (scanf("%ld",&n)!=EOF&&n)
{
getchar();
gets(key);
memset(hash,0,sizeof(hash));
long i,start;
long diff=0;
long res=0;
for (start=i=0;key[i]!='\0';++i)
{
++hash[key[i]];//映射值+1
if (hash[key[i]]==1)//如果是第一次出现
{
++diff;//不同字母数+1
if (diff>n)//如果超过n个不同字母
{
while (--hash[key[start++]]>0);//起点向右挪动 直到消去一个字母
--diff;//不同字母数返回正常取值
}
}
long len=i-start+1;//得到此时的串长度
res=res>len?res:len;//保存最大值
}
printf("%ld\n",res);
}
return 0;
}
using namespace std;
char key[1100000];
long hash[256];
int main()
{
long n;
while (scanf("%ld",&n)!=EOF&&n)
{
getchar();
gets(key);
memset(hash,0,sizeof(hash));
long i,start;
long diff=0;
long res=0;
for (start=i=0;key[i]!='\0';++i)
{
++hash[key[i]];//映射值+1
if (hash[key[i]]==1)//如果是第一次出现
{
++diff;//不同字母数+1
if (diff>n)//如果超过n个不同字母
{
while (--hash[key[start++]]>0);//起点向右挪动 直到消去一个字母
--diff;//不同字母数返回正常取值
}
}
long len=i-start+1;//得到此时的串长度
res=res>len?res:len;//保存最大值
}
printf("%ld\n",res);
}
return 0;
}