1. 程式人生 > 其它 >acwing周賽39-42(水題實錄)

acwing周賽39-42(水題實錄)

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.

https://www.acwing.com/problem/content/4315/

大意是給你兩個字串,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)