女赛----hdu2668 Daydream

题意:n个女生,字符串表示每人衣服颜色,起点为0,求最长无重复字符的连续字串长度,并要输出较小的起点和终点
思路:对于每个位置,考虑当前位置为最后一个字符时,最长重复字符的连续字串长度。要用queue存前面无重复的字符,出现重复时便出栈到新的加入不在有重复。比较答案,存起终点即可

感想:这个题一开始多理解了一点,因为样例里只有小写字母,就理解为字符串内只有英文字母了。。导致存重时出错。。再就是一开始没有用queue,用数组存的,结果MLE了。。这个题虽然确实是个水题,但是也在卡内存,强制用queue。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f;
int n,ans,l,look[500],x,ll,rr,z;
char ch[10000005];
int main()
{
    queue<int>q;
    while(~scanf("%d",&n))
    {
        while(!q.empty()) q.pop();
        gets(ch);
        gets(ch);
        memset(look,0,sizeof(look));
        ans=0;
        l=0;

        for(int i=0;i<n;i++)
        {
            if(look[ch[i]]==1)
            {
                while(!q.empty())
                {
                    z=q.front();
                    q.pop();
                    if(ch[z]==ch[i])
                    {
                        break;
                    }
                    look[ch[z]]=0;
                }
                q.push(i);
            }
            else {
                    q.push(i);look[ch[i]]=1;
                    if(i-q.front()+1>ans) {
                    ll=q.front();rr=i;
                        ans=i-q.front()+1;
            }

            }//cout<<i<<" "<<l<<" "<<i<<" "<<ll<<" "<<rr<<" "<<ans<<endl;
        }
        printf("%d %d %d\n",ans,ll,rr);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/80244010
今日推荐