[bzoj1039] [ZJOI2008]無序運動Movement

Description

  D博士對物理有著深入的研究,經典物理、天體物理、量子物理都有著以他的名字命名的定理。最近D博士著迷于研究粒子運動的無規則性。對圣經深信不疑的他相信,上帝創造的任何事物必然是有序的、有理可循的,而不是無規則的、混沌的。 經過長時間的研究,D博士找到了很多出現相當頻繁的軌跡片斷,他把這些軌跡片斷儲存在一個很大的數據庫內。他需要你幫助他寫一個程序,對于一個給出的粒子運動軌跡,統計數據庫中每個軌跡片斷的出現的次數。 為清楚起見,我們定義一個粒子的軌跡為二維平面上的一個點列(P1, P2, … PN)。點列P的一個子列[i, j]定義為P中一段連續的子序列(Pi, Pi+1, … Pj)。點列P的一個子列[u, v]被稱為點列Q = (Q1, Q2 … Qv-u+1)在P中的一次出現,當且僅當Q經過有限次的平移、旋轉、翻轉、放縮之后得到Q’滿足Q’k = Pu+k-1(k = 1 … u – v + 1)。 對平面X-Y進行四種操作的解釋平移 設平移向量為(dx, dy),則任意點(x,y)平移后的結果為(x+dx, y+dy) 旋轉 設旋轉角為t,則任意點(x,y)旋轉后的結果為 (x cos t – y sin t, x sin t + y cos t) 翻轉 任意點(x,y) 翻轉后的結果為(x, -y) 放縮 設放縮比例為p (p ≠ 0),則任意點(x,y)放縮后的結果為(px, py)

Input

  第一行兩個整數N、M,分別描述待處理的粒子運動軌跡的點列大小與數據庫內的軌跡片斷個數。接下來M行依次給出每個軌跡片斷。每行先是一個正整數K,表示該軌跡片斷點列的長度。然后2K個整數,依次描述點列中的K個點的橫坐標與縱坐標。接下來一行2N個整數,依次描述待處理的粒子運動軌跡的點列中N個點的橫坐標與縱坐標。注:輸入中的每條軌跡中任意相鄰兩點不會相同。

Output

  應包含M行,依次給出每個片段在待處理運動軌跡中的出現次數。

Sample Input

3 2
2 17 0 10 1
3 0 0 1 0 1 -1
0 0 1 0 1 1

Sample Output

2
1

Solution

考慮如果能匹配上,那么兩個圖形必定相似。

所以一個很簡單的想法就是:記錄相鄰兩條邊的邊長之比和夾角。

但是這樣顯然由于精度過低,不可行。所以修改一下記錄的東西就變成了:

記錄兩邊的邊長平方的最簡比和帶符號的兩邊向量點積叉積最簡比,一共四個整數。

注意這里先不管翻轉操作,如果帶上翻轉操作的話,把匹配串翻一下再做一遍就好了。

然后建\(AC\)自動機,用\(map\)存邊,把串丟上去跑就行了。

由于這里字符集過大只能暴力跳\(fail\)指針。

看起來能過就行了(逃。

#include<bits/stdc++.h>
using namespace std;void read(int &x) {x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}void print(int x) {if(x<0) putchar('-'),x=-x;if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}const int maxn = 2e5+10;#define sqr(x) ((x)*(x))int n,m,spj[maxn],tot,fail[maxn],cnt[maxn],lst[maxn],ans[maxn],tp[maxn];struct point {int x,y;point operator - (const point &rhs) const {return (point){x-rhs.x,y-rhs.y};}int operator * (const point &rhs) const {return x*rhs.y-y*rhs.x;}int operator ^ (const point &rhs) const {return x*rhs.x+y*rhs.y;}
}s[maxn];struct node {int a,b,c,d;bool operator < (const node &rhs) const {if(a!=rhs.a) return a<rhs.a;if(b!=rhs.b) return b<rhs.b;if(c!=rhs.c) return c<rhs.c;return d<rhs.d;}
}r[maxn];map<node,int > e[maxn];
vector <int > ed[maxn];#define iter map<node,int > :: iterator void ins(int w,int rs) {int now=0;for(int i=1;i<=w;i++) {iter it=e[now].find(r[i]);if(it==e[now].end()) now=(e[now][r[i]]=++tot);else now=it -> second;}ed[now].push_back(rs);
}void build() {queue<int > q;for(iter i=e[0].begin();i!=e[0].end();i++) q.push(i -> second);while(!q.empty()) {int now=q.front();q.pop();for(iter i=e[now].begin();i!=e[now].end();i++) {node a=i -> first;int b=i -> second,c=fail[now];for(;c&&e[c].find(a)==e[c].end();c=fail[c]);if(e[c].find(a)!=e[c].end()) c=e[c][a];fail[b]=c;lst[b]=ed[c].empty()?lst[c]:c;q.push(b);}}
}node trans(point A,point B,point C) {int a=sqr(B.x-A.x)+sqr(B.y-A.y);int b=sqr(C.x-B.x)+sqr(C.y-B.y);int c=(C-B)*(B-A),d=(C-B)^(B-A);int t=__gcd(a,b);a/=t,b/=t;t=__gcd(abs(c),abs(d)),c/=t,d/=t;return (node){a,b,c,d};
}void solve() {int now=0;for(int i=1;i<=n-2;i++) {int x=now;for(;x&&e[x].find(r[i])==e[x].end();x=fail[x]);if(e[x].find(r[i])!=e[x].end()) x=e[x][r[i]];now=x;for(;x;x=lst[x]) cnt[x]++;}
}int main() {read(n),read(m);for(int i=1;i<=m;i++) {int k,flag=1;read(k);for(int j=1;j<=k;j++) read(s[j].x),read(s[j].y);for(int j=2;j<k;j++) {r[j-1]=trans(s[j-1],s[j],s[j+1]);if(r[j-1].c) flag=0;}if(flag) spj[i]=1;if(k-2>0) ins(k-2,i),tp[i]=-1;else tp[i]=k;}build();for(int i=1;i<=n;i++) read(s[i].x),read(s[i].y);for(int i=2;i<n;i++) r[i-1]=trans(s[i-1],s[i],s[i+1]);solve();for(int i=1;i<=n;i++) s[i].x=-s[i].x;for(int i=2;i<n;i++) r[i-1]=trans(s[i-1],s[i],s[i+1]);solve();for(int i=1;i<=tot;i++)for(int j=0;j<(int)ed[i].size();j++) ans[ed[i][j]]+=cnt[i]/(spj[ed[i][j]]+1);for(int i=1;i<=m;i++) write(tp[i]>=0?n-tp[i]+1:ans[i]);return 0;
}

轉載于:https://www.cnblogs.com/hbyer/p/10370593.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于shiro session失效報錯問題

最近做了一個項目&#xff0c;要用到shiro&#xff0c;做完之后發現有個異常經常發生org.apache.shiro.session.UnknownSessionException: There is no session with id &#xff0c;經過多天的研究&#xff0c;終于得以解決 登錄的時候異常信息&#xff1a; [java] view plain…

4 網絡、掛載、關機

網絡命令: 給在線用戶發信 write 用戶名 編輯時&#xff0c;Ctrl退格鍵刪除錯誤輸入 CtrlD 保存輸入信息 wall 給所有在線用戶發信 ping命令 -c指定發送次數 ping -c 3 192.168.231.1 ifconfig 查看網卡信息 ifconfig eth1 192.168.231.100 臨時設置IP地址 mail 用戶名 …

#191 sea(動態規劃)

假設已經求出了i個點j個橋的連通圖數量f[i][j]&#xff0c;容易由此推出最終答案&#xff0c;套路地枚舉1號點所在連通塊大小即可。 假設已經求出了i個點的邊雙連通圖數量h[i]&#xff0c;考慮由此推出f[i][j]。可以枚舉其中一座橋將圖劃分成兩個部分&#xff0c;固定1號點在其…

linux下獲取占用CPU資源最多的10個進程,可以使用如下命令組合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下

linux下獲取占用CPU資源最多的10個進程&#xff0c;可以使用如下命令組合&#xff1a; ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head linux下獲取占用內存資源最多的10個進程&#xff0c;可以使用如下命令組合&#xff1a; ps aux|head -1;ps aux|grep -v PID|s…

自定義注解與validation結合使用案例

案例1&#xff1a; [java] view plaincopy import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import…

5 Vim編輯器的使用

vi filename 命令模式 a i o 插入模式 后前 行 Esc鍵 回到命令模式 Shift&#xff1a; 編輯模式 set nu加行號 執行完命令后直接回到命令模式 :set nu 設置行號 :set nonu 取消行號 移動命令&#xff1a; gg 到第一行 G 到最后一行 nG 到第n行 :n到第n行 $ 移至行…

機器學習實戰(筆記)------------KNN算法

1.KNN算法 KNN算法即K-臨近算法&#xff0c;采用測量不同特征值之間的距離的方法進行分類。 以二維情況舉例&#xff1a; 假設一條樣本含有兩個特征。將這兩種特征進行數值化&#xff0c;我們就可以假設這兩種特種分別為二維坐標系中的橫軸和縱軸&#xff0c;將一個樣本以點的形…

hive的安裝配置

hive只需安裝在一個節點上。 1、將安裝包解壓&#xff0c;cd入conf文件夾下&#xff0c;執行命令cp hive-default.xml hive-site.xml 2、更改hive-site.xml的配置項 </property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql:/…

Java注解Annotation 完成驗證

Java注解Annotation用起來很方便&#xff0c;也越來越流行&#xff0c;由于其簡單、簡練且易于使用等特點&#xff0c;很多開發工具都提供了注解功能&#xff0c;不好的地方就是代碼入侵比較嚴重&#xff0c;所以使用的時候要有一定的選擇性。 這篇文章將利用注解&#xff0c;來…

隱藏馬爾科夫模型HMM

概率圖模型 HMM 先從一個具體的例子入手,看看我們要解決的實際問題.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consider two friends, Alice and Bob, who live far apart from each other and who talk together daily over the telephone about what …

常用HQL

進入hive客戶端后&#xff1a; 1、建表&#xff1a; create table page_view(viewTime int, userid bigint,page_url string, referrer_url string,ip string comment IP Address of the User)comment This is the page view tablepartitioned by(dt string, country string)r…

阿里云天池 金融風控訓練營Task1 廣東工業站

Task1 賽題理解 一、學習知識點概要 本次學習先是介紹了賽題的背景和概況&#xff0c;題目以金融風控中的個人信貸為背景&#xff0c;給所給的47列特征中&#xff0c;根據貸款申請人的數據信息預測其是否有違約的可能&#xff0c;以此判斷是否通過貸款。隨后介紹了比賽中的評…

如何將.crt的ssl證書文件轉換成.pem格式

如何將.crt的ssl證書文件轉換成.pem格式摘自&#xff1a;https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 準備:有一臺安裝了php的linux操作系統執行下面的openssl命令即可&#xff1a;openssl x509 -in www.xx.com.crt -out www.xx.com.pem轉載于:https://…

SpringMVC學習記錄--Validator驗證分析

一.基于Validator接口的驗證. 首先創建User實例,并加入幾個屬性 ?12345678910111213141516171819202122232425262728293031323334<code class"hljs cs">public class User {private String username;private String password;private String nickname;public …

NTP時間服務器實現Linux時間同步

在linux下&#xff0c;可以通過自帶的NTP(Network Time Protocol)協議通過網絡使自己的系統保持精確的時間。 什么是NTP&#xff1f; NTP是用來使系統和一個時間源保持時間同步的協議。 在自己管理的網絡中建立至少一臺時間服務器來同步本地時間&#xff0c;這樣可以使得在不同…

阿里云天池 Python訓練營Task1:從變量到異常處理

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.變量、運算符與數據類…

python回收機制

目錄 Python的垃圾回收機制引子:一、什么是垃圾回收機制&#xff1f;二、為什么要用垃圾回收機制&#xff1f;三、垃圾回收機制原理分析1、什么是引用計數&#xff1f;2、引用計數擴展閱讀&#xff1f;&#xff08;折疊&#xff09;Python的垃圾回收機制 引子: 我們定義變量會申…

安裝openssl-devel命令

centos&#xff1a; yum install openssl-devel ubuntu&#xff1a; sudo apt-get install openssl sudo apt-get install libssl-dev

阿里云天池 Python訓練營Task2: Python基礎練習:數據結構大匯總 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.列表&#xff08;list…

windows文件與Linux文件互轉

使用命令 unix2dos filename dos2unix filename