不能小瞧双指针 有时候十分重要

[模板] [c++]
1
2
3
4
5
6
7
8
for(int i=0,j=0; i<n; i++)
{
while(j<i&&check(i,j) j++)
.....
}
直接可以替代for i 循环


最简单情况 将几个词分别输出
例abc def ghi

[例1] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[1000];
gets(str);
int n=strlen(str);
for(int i=0;i<n;i++)
{
int j=i;
while(j<n && str[i]!=' ') j++;
for(int k=i;k<j;k++) cout<<str[k]; //输出两指针之间的就行了
cout<<endl;
i=j;
}
return 0;
}

[最长连续不重复子序列] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int a[N],s[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int ans=0;
for(int i=0,j=0;i<n;i++)
{
s[a[i]]++; //i是在j之后 从后往前的
while(s[a[j]]>1) //此处不用j<=i 因为一直有重复的话 i j最终在同一位置
{
s[a[j]]--;
j++;//有重复 j往前移一格 有点像队列
}
ans=max(i-j+1,ans); //更新长度
}
}

首先要根据时间由小到大排列
注意对应的是什么还有答案输出

[acwing1238] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
pair<int, int> logs[N];

int cnt[N];

int st[N];
int n,d,k;
int main()
{
cin>>n>>d>>k;
for(int i=0;i<n;i++) cin>>logs[i].first>>logs[i].second;
sort(logs,logs+n); //时间小到大
for(int i=0,j=0;i<n;i++)
{

cnt[logs[i].second]++;
while(logs[i].first - logs[j].first>=d)
{
cnt[logs[j].second]--;
j++;
}
if(cnt[logs[i].second]>=k) st[logs[i].second]=1;
}
for(int i=0;i<N;i++)
{
if(st[i]) cout<<i<<endl;
}
return 0;

}