题意:n个字符串,两两拼接能最多形成多少种,自己可以和自己拼接。
思路:设a,b两个串要拼接判断其是否为回文串分三种情况考虑:
第一种:alen < blen a是b的反串前缀,且b的剩余部分可以认为是后缀是回文串
第二种:alen > blen b的反串是a的前缀,且a的后缀是回文串
第三种:alen == blen a就是b反串。
根据上面的三种情况我们要求出字符串是否为另一个前缀,还有就是其后缀是否为回文串。所以可以想到马拉车算法和字典树。正串建立字典树,反串去进行匹配。
#include<stdio.h> #include<math.h> #include<string.h> #include<map> #include<algorithm> #define N 200060 #define ll long long using namespace std; const int maxn=2000110; char a[maxn],text[maxn*2]; int P[maxn*2]; int trie[maxn][28],End[maxn],hou[maxn]; int n,root,ans,idx; struct point { int len; int st; }b[maxn]; void pre_treat(){ int len = strlen(a); for(int i=0;i<len;i++){ text[i*2] = '#'; text[i*2+1] = a[i]; } text[len*2]='#';text[len*2+1]='