• 1941. Scary Martian Word


    1941. Scary Martian Word

    这道题 一个长度为3的字符串视为 一个 火星文 字母(ASCII 33-122) ,给出一个火星人认为恐怖的单词(由火星字母组成)

    然后 给你一篇文章问你火星人认为恐怖的单词个数(可以乱序)

    嗯,一开始题意理解错了。。。然后就错了

    彬神说……是双端队列

    然后写了,感觉自己真是对对对的……

    嗯,过度自信,起始忽略了一个条件。

    做法,因为是三个单词 122+122*10+122*100 也就差不多了

    然后哈希。数组标记,

    懒得写了……

    贴代码……

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <queue>
    #include <stack>
    #include <set>
    #include <string>
    #include <sstream>
    using namespace std;
    typedef long long ll;
    const double ESP = 10e-8;
    const int MAXN = 2000000 + 10;
    
    int vis[MAXN];
    int num[MAXN];
    int arr[MAXN];
    int n;
    char word[MAXN*3+1];
    int main(){
    //    freopen("input.txt","r",stdin);
    
        int ans = 0;
        memset(num,0,sizeof(num));
        n = 0;
        gets(word);
        int len = strlen(word);
        for(int i = 0;i < len;i+=4){
            int tt = (word[i]-33) + (word[i+1]-33)*10+(word[i+2]-33)*100;
            num[tt]++;
            if(num[tt] == 1){
                n++;
            }
        }
        gets(word);
        len = strlen(word);
        memset(arr,-1,sizeof(arr));
        int cnt = 0;
        for(int i = 0;i < len;i+=4){
            int tt = (word[i]-33) + (word[i+1]-33)*10+(word[i+2]-33)*100;
            if(num[tt]){
                arr[cnt++] = tt;
            }
        }
        int l = 0;
        int r = 0;
        memset(vis,0,sizeof(vis));
        int nn = 0;
        while(l < cnt && r < cnt){
            if(arr[r] != -1){
                vis[ arr[r] ]++;
                if(vis[arr[r]] == num[arr[r] ]){
                    nn++;
                }else if(vis[ arr[r] ] > num[ arr[r] ]){
                    while(l < cnt && arr[l] != arr[r]){
                        if(vis[arr[l] ] == num[arr[l] ]){
                            nn--;
                        }
                        vis[ arr[l] ]--;
                        l++;
                    }
                    vis[ arr[l]]--;
                    l++;
                }
                if(nn == n){
                    ans++;
                    vis[arr[l]]--;
                    nn--;
                    l++;
                }
                r++;
            }else{
                nn = 0;
                memset(vis,0,sizeof(vis));
                r++;
                l = r;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }

    不写注释的果然不是好程序员……

  • 相关阅读:
    MySQL数据库常见面试题
    抽象类与接口
    HashMap与Hashtable的区别
    IDEA破解
    重写equals方法
    MFC编程入门之十七(对话框:文件对话框)
    MFC编程入门之十六(对话框:消息对话框)
    MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
    MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
    MFC编程入门之十二(对话框:非模态对话框的创建及显示)
  • 原文地址:https://www.cnblogs.com/hanbinggan/p/4687232.html
Copyright © 2020-2023  润新知