求区间内所有本质不同的回文串的数量
水题,枚举后缀记录即可
A C AC AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int MAXN = 1050; const int INF = 0X3f3f3f3f; const int MOD = 51123987; char s[MAXN]; int n; struct Trie{ int nxt[MAXN][26],fail[MAXN],len[MAXN]; int sz,lst,sn; char str[MAXN]; inline void Init(){ memset(nxt,0,sizeof(nxt)); memset(fail,0,sizeof(fail)); memset(len,0,sizeof(len)); fail[0] = fail[1] = 1; len[0] = 0,len[1] = -1; sz = lst = 1; str[0] = '#'; sn = 0; } inline void Insert(char ch){ str[++sn] = ch; int root = lst; while(str[sn]!=str[sn-len[root]-1]) root=fail[root]; if(!nxt[root][ch-'a']){ len[++sz] = len[root] + 2; int tmp = fail[root]; while(str[sn]!=str[sn-len[tmp]-1]) tmp=fail[tmp]; fail[sz] = nxt[tmp][ch-'a']; nxt[root][ch-'a'] = sz; } lst = nxt[root][ch-'a']; } }PAM; int f[MAXN][MAXN]; inline void solve(){ for(int i=1;i<=n;i++){ PAM.Init(); for(int j=i;j<=n;j++){ PAM.Insert(s[j]); f[i][j] = PAM.sz-1; } } } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%s",s+1); n = strlen(s+1); int Q,l,r; scanf("%d",&Q); solve(); while(Q--){ scanf("%d%d",&l,&r); printf("%d\n",f[l][r]); } } return 0; }