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;
}
posted @ 2008-08-31 02:10  Hdu-Lost  阅读(380)  评论(0编辑  收藏  举报