不能小瞧双指针 有时候十分重要
[模板] [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; }
|