bzoj 4598: [Sdoi2016]模式字符串

題目描述

給出n個結點的樹結構T,其中每一個結點上有一個字符,這里我們所說的字符只考慮大寫字母A到Z,再給出長度為m的模式串s,其中每一位仍然是A到z的大寫字母。

Alice希望知道,有多少對結點<u,v>滿足T上從u到V的最短路徑形成的字符串可以由模式串S重復若干次得到?

這里結點對<u,v>是有序的,也就是說<u,v>和<v,u>需要被區分。

所謂模式串的重復,是將若干個模式串S依次相接(不能重疊)。例如當S=PLUS的時候,重復兩次會得到PLUSPLUS,重復三次會得到PLUSPLUSPLUS,同時要注恿,重復必須是整數次的。例如當S=XYXY時,因為必須重復整數次,所以XYXYXY不能看作是S重復若干次得到的。

輸入輸出格式

輸入格式:

每一個數據有多組測試,

第一行輸入一個整數C,表示總的測試個數。

對于每一組測試來說:

第一行輸入兩個整數,分別表示樹T的結點個數n與模式長度m。結點被依次編號為1到n,

之后一行,依次給出了n個大寫字母(以一個長度為n的字符串的形式給出),依次對應樹上每一個結點上的字符(第i個字符對應了第i個結點)。

之后n-1行,每行有兩個整數u和v表示樹上的一條無向邊,之后一行給定一個長度為m的由大寫字母組成的字符串,為模式串S。

輸出格式:

給出C行,對應C組測試。

每一行輸出一個整數,表示有多少對節點<u,v>滿足從u到v的路徑形成的字符串恰好是模式串的若干次重復.

輸入輸出樣例

輸入樣例#1:?復制
1
11 4
IODSSDSOIOI
1 2
2 3
3 4
1 5
5 6
6 7
3 8
8 9
6 10
10 11
SDOI
輸出樣例#1:?復制
5

說明

1<=C<=10,3<=N<=1000000,3<=M<=1000000

題解

  題解大概看懂一點了……就是說用hash+點分治……好討厭hash……總感覺還是半懂不懂……

  考慮每一個分治點,從他延伸下去能形成長度為多少的前綴和后綴(不包含自己和包含自己),然后兩個兩兩組合起來計算答案

  據說時間復雜度$O(Tnlogn)$,數據就是為了卡點分的,然而因為全世界都只有前三組數據……所以能A……

  1 //minamoto
  2 #include<cstdio>
  3 #include<iostream>
  4 #include<cstring>
  5 #define N 1000003
  6 #define ull unsigned long long
  7 #define ll long long
  8 #define p 2000001001
  9 #define inf 1000000000
 10 using namespace std;
 11 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
 12 inline int read(){
 13     #define num ch-'0'
 14     char ch;bool flag=0;int res;
 15     while(!isdigit(ch=getchar()))
 16     (ch=='-')&&(flag=true);
 17     for(res=num;isdigit(ch=getchar());res=res*10+num);
 18     (flag)&&(res=-res);
 19     #undef num
 20     return res;
 21 }
 22 char sr[1<<21],z[30];int C=-1,Z;
 23 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
 24 inline void print(ll x){
 25     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
 26     while(z[++Z]=x%10+48,x/=10);
 27     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
 28 }
 29 int n,m,T,n1,rt,head[N],Next[N<<1],ver[N<<1],tot,size[N],son[N],sz,sz1;
 30 int st[N],st1[N],len[N],cnt[N],cnt1[N];
 31 ull mi[N],a[N],a1[N],b[N],c[N],val[N],sum[N],sum1[N];
 32 ll ans;
 33 bool vis[N];char s[N];
 34 inline void add(int u,int v){
 35     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
 36     ver[++tot]=u,Next[tot]=head[v],head[v]=tot;
 37 }
 38 void findrt(int u,int fa){
 39     size[u]=1,son[u]=0;
 40     for(int i=head[u];i;i=Next[i]){
 41         int v=ver[i];
 42         if(vis[v]||v==fa) continue;
 43         findrt(v,u);
 44         cmax(son[u],size[v]);
 45         size[u]+=size[v];
 46     }
 47     cmax(son[u],n1-size[u]);
 48     if(son[u]<son[rt]) rt=u;
 49 }
 50 void getdep(int u,int fa){
 51     if(b[len[u]]==sum[u]&&val[u]==a[1]) st[++sz]=u;
 52     for(int i=head[u];i;i=Next[i]){
 53         int v=ver[i];if(vis[v]||v==fa) continue;
 54         sum[v]=sum[u]*p+val[v];
 55         len[v]=len[u]+1;
 56         getdep(v,u);
 57     }
 58 }
 59 void getdep1(int u,int fa){
 60     if(c[len[u]]==sum1[u]&&val[u]==a1[1]) st1[++sz1]=u;
 61     for(int i=head[u];i;i=Next[i]){
 62         int v=ver[i];
 63         if(vis[v]||v==fa) continue;
 64         sum1[v]=sum1[u]*p+val[v];
 65         getdep1(v,u);
 66     }
 67 }
 68 void calc(int u){
 69     for(int i=0;i<=m;++i) cnt[i]=cnt1[i]=0;
 70     if(a[1]==val[u]) cnt[1]=1;
 71     if(a[m]==val[u]) cnt1[1]=1;
 72     if(m==1) ans+=cnt1[1];
 73     for(int i=head[u];i;i=Next[i]){
 74         int v=ver[i];
 75         if(vis[v]) continue;
 76         sz=0,len[v]=1,sum[v]=val[v];
 77         getdep(v,u);
 78         for(int j=1;j<=sz;++j){
 79             int t=st[j];int pos=m-(len[t]-1)%m-1;
 80             if(pos==0) pos+=m;
 81             ans+=(ll)cnt1[pos];
 82         }
 83         sz1=0,sum1[v]=val[v];
 84         getdep1(v,u);
 85         for(int j=1;j<=sz1;++j){
 86             int t=st1[j];int pos=m-(len[t]-1)%m-1;
 87             if(pos==0) pos+=m;
 88             ans+=(ll)cnt[pos];
 89         }
 90         for(int j=1;j<=sz;++j){
 91             int t=st[j];int pos=(len[t])%m+1;
 92             if(val[u]==a[pos]) ++cnt[pos];
 93         }
 94         for(int j=1;j<=sz1;++j){
 95             int t=st1[j];int pos=(len[t])%m+1;
 96             if(val[u]==a1[pos]) ++cnt1[pos];
 97         }
 98     }
 99 }
100 void solve(int u){
101     calc(u),vis[u]=1;int totsz=size[u];
102     for(int i=head[u];i;i=Next[i]){
103         int v=ver[i];
104         if(vis[v]) continue;
105         rt=0;
106         n1=size[v];
107         if(n1<m) continue;
108         findrt(v,u);
109         solve(rt);
110     }
111 }
112 int main(){
113     T=read(),mi[0]=1;
114     for(int i=1;i<=1000000;++i) mi[i]=mi[i-1]*p;
115     while(T--){
116         n=read(),m=read(),tot=0,ans=0;
117         memset(head,0,sizeof(head));
118         scanf("%s",s+1);
119         for(int i=1;i<=n;++i) val[i]=s[i]-'A'+1;
120         for(int i=1;i<n;++i){
121             int u=read(),v=read();add(u,v);
122         }
123         scanf("%s",s+1);
124         for(int i=1;i<=max(n,m);++i) a[i]=s[(i-1)%m+1]-'A'+1;
125         for(int i=1;i<=max(n,m);++i) b[i]=b[i-1]+a[i]*mi[i-1];
126         for(int i=1;i<=m;++i) a1[m-i+1]=a[i];
127         for(int i=1;i<=max(n,m);++i) a1[i]=a1[(i-1)%m+1];
128         for(int i=1;i<=max(n,m);++i) c[i]=c[i-1]+a1[i]*mi[i-1];
129         memset(vis,0,sizeof(vis));
130         son[0]=inf,rt=0,n1=n;
131         findrt(1,0);
132         solve(rt);
133         print(ans);
134     }
135     Ot();
136     return 0;
137 }

?

轉載于:https://www.cnblogs.com/bztMinamoto/p/9492759.html

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

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

相關文章

[譯] 機器學習可以建模簡單的數學函數嗎?

原文地址&#xff1a;Can Machine Learning model simple Math functions?原文作者&#xff1a;Harsh Sahu譯文出自&#xff1a;掘金翻譯計劃本文永久鏈接&#xff1a;github.com/xitu/gold-m…譯者&#xff1a;Minghao23校對者&#xff1a;lsvih&#xff0c;zoomdong機器學習…

下載spotify音樂_如何在Spotify上播放更高質量的音樂

下載spotify音樂With Spotify Premium, you get access to higher quality music streaming. By default (and if you’re on the free plan), Spotify streams at 96kbps on mobile and 160kbps on your computer. At these sort of bitrates, you’ll hear a small but notic…

ubuntu scp命令或者用root連接ssh提示:Permission denied, please try again.錯誤

1、su -            #&#xff01;&#xff01;&#xff01; 2、vi /etc/ssh/sshd_config 3、PermitRootLogin yes    # 找到此字段&#xff0c;改為此行所示 4、/etc/init.d/ssh restart    # 重啟ssh服務 轉載于:https://www.cnblogs.com/weiyiming007/p…

Windows下壓縮包安裝Mysql

1. 下載mysql壓縮包 2. 解壓到指定目錄&#xff0c;例如D:\Program Files\mysql-5.7.25-winx64 3. 在目錄下創建配置文件my.ini [mysqld] port 3306 basedirD:/Program Files/mysql-5.7.25-winx64 datadirD:/Program Files/mysql-5.7.25-winx64/data max_connections200 char…

如何從終端打開Ubuntu Nautilus文件瀏覽器

Recently, we showed you how to open a directory in Terminal from within Nautilus. However, what if you’re working on the command line in Terminal and need to access the same directory in Nautilus? There’s an easy solution for that. 最近&#xff0c;我們向…

mysql 面試知識點筆記(七)RR如何避免幻讀及非阻塞讀、范式

2019獨角獸企業重金招聘Python工程師標準>>> 表象&#xff1a;快照讀&#xff08;非阻塞讀&#xff09;--偽MVCC &#xff08;Multi-Version Concurrent Controll多版本并發控制&#xff09; 內在&#xff1a;next-key鎖(record鎖gap鎖) rr serializabel 都支持gap鎖…

pdf 奇數頁插入頁碼_如何在Word 2013中的奇數頁碼上啟動新部分

pdf 奇數頁插入頁碼When working on a long document or a book in Word, it’s common to divide the document into sections or chapters. A common practice is to start each new section or chapter on an odd page. This is easily accomplished using sections in Word…

徹底攻克C語言指針

前面我們講解了指針數組、二維數組指針、函數指針等幾種較為復雜的指針&#xff0c;它們的定義形式分別是&#xff1a; int *p1[6]; //指針數組int *(p2[6]); //指針數組&#xff0c;和上面的形式等價int (*p3)[6]; //二維數組指針int (*p4)(int, int); //函數指針我相信大部分…

流水線上的思考——異步程序開發模型(2)

上一期我們講了一個簡單的流水線處理流程&#xff0c;正如我們在上期最后所說那樣&#xff0c;這個簡單的流水線處理流程對于后續有慢設備操作的業務來說&#xff0c;性能有可能偏低。今天我們來討論一下如何提高性能的方法。首先讓我們來大致區分一下一般業務的處理方式。目前…

java ReentrantLock 鎖相關筆記

為什么80%的碼農都做不了架構師&#xff1f;>>> ReentrantLock重入鎖簡單理解就是對同一個線程而言&#xff0c;它可以重復的獲取鎖。例如這個線程可以連續獲取兩次鎖&#xff0c;但是釋放鎖的次數也一定要是兩次 Lock locknew ReentrantLock(true);//公平鎖 Lock …

計算機啟動程序bios_如何構建自己的計算機,第三部分:準備BIOS

計算機啟動程序biosSo you’ve carefully picked out some parts and built a computer, but it doesn’t really do anything…yet. Before we hop into installing your operating system, we need to take a quick look at the BIOS and prepare it for our operating syste…

PLSQL 之類型、變量和結構

1、類型 在《.Net程序員學用Oracle系列(5)&#xff1a;三大數據類型》一文中詳細地講述了 Oracle 的基本數據類型&#xff0c;文中還提到&#xff0c;除基本數據類型之外&#xff0c;Oracle 還在語法上支持一些非固有數值類型。 事實上&#xff0c;Oracle 在語法上支持的數據類…

kindle圖書免費下載_如何在Kindle上免費簽出圖書館書籍

kindle圖書免費下載Tired of paying so much for ebooks? Most libraries these days let you check out eBooks, for free, just like regular books. 厭倦了為電子書支付這么多錢&#xff1f; 如今&#xff0c;大多數圖書館都讓您免費閱讀電子書&#xff0c;就像普通書籍一樣…

第五章 了解你的用戶

第五章 了解你的用戶邏輯人的爭議&#xff1a;要學會把軟件開發簡單易用象牙塔式的開發&#xff1a;開發團隊常年閉封在“高塔”之中&#xff0c;一門心思的做著魔法一般的軟件。這些開發者根本就不知道用戶會怎么樣的使用他們所做的軟件。我們應該避免這種象牙塔式的開發&…

總結之:CentOS 6.4系統裁減詳解及裝載網卡步驟

前言 隨著接觸Linux的慢慢深入、對Linux也有了一個基本認識了吧&#xff0c;慢慢的接觸系統內核、系統配置文件、在了解Linux的系統啟動流程后&#xff0c;現在來總結一下一個簡單的Linux系統的裁減方法和步驟&#xff0c;一個只有內核文件和幾個簡單的命令的小Linux系統&am…

android 設備占用_如何查看正在占用Android設備的空間

android 設備占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how yo…

最近沉迷生意經

高度戰略搶占顧客心智 速度戰略 . 規模不夠就談發展速度&#xff0c;避開自己的劣勢&#xff1b; . 發展速度快說明產品好&#xff0c;受歡迎度高; 錢是工具&#xff0c;從錢上解脫 . 不能被錢所困 . 放下錢&#xff0c;才能瀟灑地使用錢 第一時間搶占顧客心智 . 核心點就是搶占…

mysql密碼正確卻提示錯誤, 不輸入密碼反而能登錄

今天部署阿里云服務器, 發現之前可以連接的mysql服務器突然連接不上了, 密碼我確認是正確的,但登錄時就是顯示密碼錯誤, 很崩潰, 差點氣得我就想重裝mysql了。 好在經過幾番苦尋找到了以下能解決我問題的資料&#xff0c; 成功解決了我的問題&#xff0c; 萬分感謝&#xff0c;…

域用戶權限|安裝軟件

如何讓普通的域用戶有安裝軟件的權限&#xff1f;現在給客戶部署了活動目錄&#xff0c;客戶要求 普通的域用戶也可以自己安裝軟件。不知道如何設置&#xff0c;希望大家幫幫忙&#xff01;我告訴客戶的做法如下&#xff1a;不知道可行性如何&#xff1f; 1、在域中新建一個域賬…

c/c++ new delete初探

new delete初探 1&#xff0c;new有2個作用 開辟內存空間。調用構造函數。2&#xff0c;delete也有2個作用 釋放內存空間調用析構函數。如果用new開辟一個類的對象的數組&#xff0c;這個類里必須有默認(沒有參數的構造函數&#xff0c;或者有默認值的參數的構造函數)的構造函數…