这道题 一个长度为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; }
不写注释的果然不是好程序员……