acwing周賽39-42(水題實錄)
阿新 • • 發佈:2022-03-13
39.第一次打acwing
實話實說,acwing這個平臺也還不錯,雖然周賽有點水,但是可以增加我的信心加快我的程式碼速度與
a題竟然WA了兩發,著實是有點心急而導致翻車
b.
https://www.acwing.com/problem/content/submission/code_detail/11570173/
大意是給你一個二維平面上的n個點,給一個基準點,問你總共有多少條過基準點和n個點中一點的直線。時間有些久遠,我已經忘卻我怎麼WA的了 QAQ
其實這題挺水的,用pair<int,int>存一下x,y座標,把斜率用map存起來即可
#include<bits/stdc++.h> #define ll long long using namespace std; pair<int,int>a[1010],b[1010]; map<double,int>mp; double c[1010]; int main(){ int n,x,y;int cnt=0; cin>>n>>x>>y; for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second; for(int i=1;i<=n;i++){ b[i].first=a[i].first-x; b[i].second=a[i].second-y; if(b[i].first){ c[i]=double(b[i].second)/double(b[i].first); if(!mp[c[i]])mp[c[i]]=1; else cnt++;} else { if(!mp[100000])mp[100000]=1; else cnt++; } } cout<<n-cnt<<endl; return 0;}
42
這次狀態不怎麼樣,有點卡題~
老規矩,a題水題
b.
大意是給你兩個字串,q次詢問s1的[l,r]中有幾個s2
資料範圍:(wssb,寫部落格的時候才發現我把n,m範圍看錯了,我說我怎麼一直segmation fault,氣抖冷)
s1,s2,長度 1<=n,m<=1000,1<=q<=\(10^{5}\)(啊啊啊我看成30%的資料範圍了)
我的思路:q較大,因此儘量離線操作,在詢問前先處理出結果
處理形式為n*n陣列,記錄從各個左端點到右端點的ans
建立一個ok陣列,初始化為1,遍歷s1,如果s1[i]==s2[0],遍歷s2比對,匹配失敗則ok[i]=0;
#include<bits/stdc++.h> #define ll long long using namespace std; int main(){int ok[50],cnt[50][50]={0}; for(int i=0;i<50;i++)ok[i]=1; int n,m,q; cin>>n>>m>>q; string s1,s2; cin>>s1>>s2; for(int i=0;i<n;i++){ if(i+m>n){ ok[i]=0;continue; } else if(s1[i]==s2[0]){ for(int j=i;j<i+m;j++){ if(s1[j]!=s2[j-i]){ ok[i]=0;break;} }} else {ok[i]=0;continue; }} for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ for(int k=i;k<=j;k++){ if(ok[k]&&k+m-1<=j)cnt[i][j]++; } } } for(int i=1;i<=q;i++){ int l,r;cin>>l>>r; if(n<m||l>=r)cout<<"0"<<endl; else cout<<cnt[l-1][r-1]<<endl; //cout<<a[0]<<endl; // for(int i=0;i<n;i++)cout<<ok[i]<<' '; } return 0;}
結果yxc直接搞了一個stl出來秒殺了這個題,我的內心是崩潰的,化身憤怒的罰時巨獸~~
y總程式碼:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m, Q;
string S, T;
char strs[N], strt[N];
int s[N];
int main()
{
scanf("%d%d%d", &n, &m, &Q);
scanf("%s%s", strs, strt);
S = strs, T = strt;
S = ' ' + S;
for (int i = m; i <= n; i ++ )
{
s[i] = s[i -1 ];
if (S.substr(i - m + 1, m) == T)
s[i] ++ ;
}
while (Q -- )
{
int l, r;
scanf("%d%d", &l, &r);
l += m - 1;
if (l > r) puts("0");
else printf("%d\n", s[r] - s[l - 1]);
}return 0;
}
知道了string.substr()這個函式之後這題也很水了,主要再學習一些y總的思路:
處理從1到i的ok[i],用字首和給出ans,時間複雜度為o(n)