悲剧文本

这个是静态链表,基于数组实现的链表。最开始完全不能理解,但是之后不断查资料,大概有个模型,通过两个数组,一个记录数据,一个记录应该输出的顺序,然后由顺序这个数组进行一个循环,然后再输出,所以这一道题目就可以使用这个性质;当遇到[将光标cur记为0;]则为最后的last。然后这些顺序呢记录到顺序的数组

#include <cstdio>
#include <cstring>
char s[1100047];
int hash[247];
int main()
{
    __int64 n;
    while(~scanf("%I64d",&n) && n)
    {
        getchar();
        gets(s);
        __int64 len = strlen(s);
        memset(hash,0,sizeof(hash));
        __int64 i, star = 0, ans = 0, diff = 0;
        for(i = 0; i < len; i++)
        {
            ++hash[s[i]];//映射值+1
            if(hash[s[i]] == 1)//如果是第一次出现
            {
                diff++;//不同字母数+1
                if(diff > n)//如果超过n个不同字母
                {
                    while(--hash[s[star++]] > 0);//起点向右挪动 直到消去一个字母
                    diff--;//不同字母数返回正常取值
                }
            }
            int LEN = i-star+1;//得到此时的串长度
            ans = ans > LEN?ans:LEN;//保存最大值
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-11 20:59:28

悲剧文本的相关文章

UVa11988 Broken Keyboard(悲剧文本)

UVa11988 Broken Keyboard(悲剧文本) 题目链接:UVa11988 题目描述: 输入包含多组数据,每组数据占一行,包含不超过100000个字母.下划线.字符"["或者"]".其中字符"["表示Home键,"]"表示End键.输入结束标志为文件结束符(EOF)输入文件不超过5MB,对于每组数据,输出一行,即屏幕上的悲剧文本 样例输入: This_is_a_[Beiju]_text [[]][]Happy_B

Broken Keyboard(悲剧文本)

你有一个键盘,键盘上所有的键都能正常使用,只是Home键和End键有时会自动按下.你并不知道这一情况,而是专心地打稿子,甚至连显示器都没开电源.当你打开显示器之后,展现在你面前的是一段悲剧文本.你的任务是根据给出的键盘上实际输入的内容,计算并输出这段悲剧文本(即显示器上展现的文本) Input: 一行文本不超过1000000个字符,只包括字母.下划线.字符'['(表示Home键)和字符']'(表示End键盘). Output: 一个字符串,即符合题目描述的悲剧文本. Example: Input

Broken Keyboard--又名悲剧文本(线性表)

 题目: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下.你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开.当你 打开显示器之后, 展现在你面前的是一段悲剧的文本.你的任务是在打开显示器之前计算出 这段悲剧文本. 输入包含多组数据.每组数据占一行,包含不超过100000个字母.下划线.字符"["或 者"]".其中字符"["表示Home键, "]"表示End键.输入结

单链表1(悲剧文本)

#include"iostream" using namespace std; typedef char element; class List{ private: element data; public:List *next; List(int data = 0){ this->data = data; this->next = NULL; } void deleteNote(){ //删除后一个结点 List *temp = this->next; this-&

UVA11988:悲剧文本(模拟链表)

You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (internally). You're not aware of this iss

悲剧文本(Broken Keyboard (a.k.a. Beiju Text),UVA 11988)

题目描述: 题目思路: 1.使用链表来重新定位各个字符 2.用数组实现链表 3.开一个数组list[i]来存储字符数组下一个字符的位置 #include <iostream> #include <cstring> using namespace std; const int maxn = 100000 + 5; int last,cur,list[maxn] ; char s[maxn] ; int main(int argc, char *argv[]) { while(scan

数组模拟单向链表例题(UVa11988)

指针的链表实现方式是,当前节点的next指向下一个节点,用数组模拟就是 for(int i=next[0];i!=0;i=next[i]) i=next[i]:就是一条链. 例题: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自动按下.你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开.当你打开显示器时之后,展现在你面前的是一段悲剧文本.你的任务时在打开显示器之前计算出这段悲剧文本. 输入包含多组数据.每组数据占一行,包含不超过100000个字母

11988 - Broken Keyboard (a.k.a. Beiju Text)

Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (inter

UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

刘汝佳的题目,悲剧文本 -_-||| 这里使用vector<string>容器倒置记录数据,然后从后面输出就可以了. 难度就是不知道这样的文档到底哪里是开始输出,故此使用动态管理内存的容器比较好做. 增加了io处理的O(n)算法也没有上榜,郁闷. #include <stdio.h> #include <vector> #include <string> using std::vector; using std::string; const int MAX_