Codeforces 367B - Sereja ans Anagrams(map)
4399 단어 CodeForces
Sereja needs to rush to the gym, so he asked to find all the described positions of q.
Input The first line contains three integers n, m and p (1 ≤ n, m ≤ 2·105, 1 ≤ p ≤ 2·105). The next line contains n integers a1, a2, …, an (1 ≤ ai ≤ 109). The next line contains m integers b1, b2, …, bm (1 ≤ bi ≤ 109).
Output In the first line print the number of valid qs. In the second line, print the valid values in the increasing order.
Examples input 5 3 1 1 2 3 2 1 1 2 3 output 2 1 3 input 6 3 2 1 3 2 2 3 1 1 2 3 output 2 1 2
제목: 문자열 a와 b, 그리고 정수 p. a의 어느 위치에서부터 p의 길이마다 문자를 하나씩 가져오라고 합니다. 이렇게 하면 몇 조를 꺼낼 수 있는지 물어보면 꺼낸 문자열이 b와 같을 수 있습니다(순서가 다를 수 있습니다).
문제풀이 사고방식: 각 위치를 매개하고 꺼낸 것을 queue에 넣고 길이가 b와 같으면 한 번 비교한 다음에 pop(), 하나를 내려놓으면 복잡도가 O(n)임을 보증한다.비교할 때 맵을 사용할 수 있습니다. 무질서하기 때문입니다.
AC 코드:
#include
using namespace std;
const int maxn = 2e5+5;
map <int, int> mp;
map <int, int> b;
bool vis[maxn];
int a[maxn];
int n, m, p;
int res = 0;
void fun(int s)
{
queue <int> Q;
mp.clear();
for(int i = s; i <= n; i += p){
Q.push(i);
mp[a[i]]++;
if(Q.size() == m){
if(mp == b){
vis[Q.front()] = 1;
res++;
}
int tmp = Q.front();
Q.pop();
mp[a[tmp]]--;
if(!mp[a[tmp]])
mp.erase(a[tmp]);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin >> n >> m >> p;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++){
int tmp;
cin >> tmp;
b[tmp]++;
}
for(int i = 1; i <= p; i++)
fun(i);
cout << res << endl;
for(int i = 1; i <= n; i++)
if(vis[i])
cout << i << " ";
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
문제 풀이 보고서 의 CodeForces 91B QueueOtherwise, print the i-th walrus's displeasure: the number of other walruses that stand between him and the furthest fro...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.