zoukankan      html  css  js  c++  java
  • 小P的秘籍

    题目描述
    小P马上就要来到程序设计大赛的现场、上了,他希望能够AK这次比赛,所以他找到了一个字符串。 
    这个字符串长度为n,由A和K组成。这个字符串被小p称为AK串。小P任意截取一个区间s,使得这个区间从左往右或从右往左在读取子串的过程中,子串中字母K的个数始终不小于A的个数。小p希望知道能够截取区间s的最大长度。 
    如果小p得到了这个区间的最大长度,那么他就会得到一个AK 这次比赛的秘籍,请你帮助他得到这个区间的最大长度。 
    输入
    第一行一个整数n (n<=106),接下来一个长度为n的只含有A,K的字符串
    输出
    一个整数,区间的最大长度
    样例输入 Copy
    6
    AKAKKA
    样例输出	Copy
    4
    提示
    样例解释 
    取出区间为KAKK 
    
    
    对于30%数据,N<=2000。 
    对于另外10%数据,a或者k其中一个仅出现一次。 
    对于全部数据 N<=10^6。 
    

     

    错误代码:

    //筛选法?  AK
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn=1000010;
    string str;
    int book[1000010];
    int b[1000010]; 
    int main()
    {
        memset(book,0,sizeof(book));
        memset(b,0,sizeof(b));
        int n,x=0,y=0,j,i,tmp=0;
        cin>>n;
        cin>>str;
        str=' '+str;
    //    cout<<str.length()<<endl;
    //    for(i=1;i<=n;i++) cout<<book[i]<<" ";
        for(i=1;i<=n;i++){//y>x
            if(str[i]=='A') x++;
            else y++;
            if(y<x) {
            book[i]=0;
            x=0;
            y=0;}
            else {
            book[i]=book[i-1]+1;
    //        cout<<"i="<<i<<endl;
        }
    }
    x=0;
    y=0;
    for(i=n;i>=1;i--){//y>x
            if(str[i]=='A') x++;
            else y++;
            if(y<x) {
            b[i]=0;
            x=0;
            y=0;}
            else {
            b[i]=b[i+1]+1;
    //        cout<<"i="<<i<<endl;
        }
    }
            for(i=1;i<=n;i++) {
            if(book[i]&&b[i]) tmp=max(tmp,max(b[i],book[i]));
            }
            cout<<tmp<<endl;
            
    }
    View Code

    AC代码:

    #include<bits/stdc++.h>
     
    using namespace std;
     
    int main(){
        int n;
        cin>>n;
        string str;
        cin>>str;
        int i=0,j=0;//[i,j]
        int a=0,k=0;
        int ans=0;
        while(1){
            while(j<str.size()&&k>=a){
            if(str[j]=='A')a++;
            if(str[j]=='K')k++;
            j++;
            if(k>=a){
                int cnt=0;
                for(int r=j-1;r>=i;r--){
                if(str[r]=='A')cnt--;
                if(str[r]=='K')cnt++;
                if(cnt<0)break;
                }
                if(cnt>=0)ans=max(ans,j-i);
            }
            }
            if(k>=a)break;
            while(i<j && k<a){
                if(str[i]=='A')a--;
                if(str[i]=='K')k--;
                i++;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    分析:

  • 相关阅读:
    招聘.Net中高级软件研发工程师
    布局和救火
    UITableView详解(转)
    iOS开发那些事--性能优化–内存泄露问题的解决(转)
    LeeCode(PHP) 2.add-two-numbers
    LeeCode(PHP) 1.Two Sum
    PHP实现 序列帧拆分
    PHPExcel导出大量数据超时及内存错误解决方法(转)
    laravel路由 实现短连接生成及跳转(php 301重定向)
    从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续(面试题)
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10474083.html
Copyright © 2011-2022 走看看