題面傳送門
我們一句話題意:求兩個字串的公共回文子串的數量;
首先對於每個串構造乙個回文自動機,然後由pam的定義可知:對於pam上從根節點轉移方式相同所到達的點代表的回文串是相同的;
這樣對於兩個pam同時dfs,每次dfs到的節點的數值(在其原串中的出現數量)相乘,然後累加到答案裡;
注意:要從偶原點和奇原點各自跑一遍dfs;
#include #define inc(i,a,b) for(register int i=a;i<=b;i++)#define dec(i,a,b) for(register int i=a;i>=b;i--)
using
namespace
std;
class
node2pam[
50010
];
long
long f[50010
];
int size=0
;
int root1=size++;
int root2=size++;
int last=root2;
void
set()
void add(int to,int
pos)
last=pam[u].ch[to];
f[last]++;
}}pam1,pam2;
long
long ans=0
;void dfs(int x,int
y) }
}int
main()
/*puppy
puppup
*/
JSOI2013 旅行時的困惑
傳送門 由於我們的圖不僅是乙個 text 而且在形態上還是一棵樹,也就是說我們為了實現節點之間互相可達,就必須把每條邊都覆蓋一次,因為兩個點之間的路徑是唯一的。那麼題意就變成了 每次在圖上選出一條路徑,覆蓋上面的邊,求最小的路徑數使得所有邊都被覆蓋至少一次。看到這裡我不禁聯想起這道題 那麼對於這道題...
題解 JSOI2013 旅行時的困惑
首先我們要思考乙個問題,公交線路要加到什麼程度才能夠使得任意兩個點兩兩可達 很容易知道每個點和他的父親必須兩兩可達 所以最終所有公交線路新增的邊其實就是把原來的邊全部反向 那麼這些邊要如何組成公交線路呢,必須要滿足,在這條公交線路中,邊的指向相同,要麼都向上,要麼都向下,或者原來向上,在某個點轉成向...
Jsoi2013 遊戲中的學問 解題報告
其實是很簡單的題,一開始想的有點麻煩了。一開始是這麼想的。f k,n i 3n n 1i 1 i 1 f k 1,n i i 3n n 1 n i f k 1,n i f k,n n 1n i 3nf k 1 n i n i 就是列舉第乙個人所屬的環長。但是其實不用這樣。f k,n n 1 n 2 ...