标签:col pair fir strstr code scan eid element stdin
给你S串和T串,用T串的所有前缀去匹配S串(匹配值是最长公共子串)。
问你总值相加是多少。
先把两个S,T串倒过来,再拼接 S#T 合成一串,跑一下后缀数组
在排序好的rank里计算每个T后缀的最长匹配长度。(前后两个for即可)
最后dp对后缀取max,累计答案。(因为后缀从pos开始的ans1肯定被后缀从pos-1开始的ans2包含,所以如果ans2<ans1,那要对ans2取max(ans1)
1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> https://www.nitacm.com/problem_show.php?pid=585 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr 13 #include <string> 14 #include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15 #include <cmath> 16 #include <deque> 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less 18 #include <vector>//emplace_back 19 //#include <math.h> 20 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor 21 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare) 22 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation 23 #define fo(a,b,c) for(register int a=b;a<=c;++a) 24 #define fr(a,b,c) for(register int a=b;a>=c;--a) 25 #define mem(a,b) memset(a,b,sizeof(a)) 26 #define pr printf 27 #define sc scanf 28 #define ls rt<<1 29 #define rs rt<<1|1 30 typedef long long ll; 31 #define rint register int 32 void swapp(int &a,int &b); 33 double fabss(double a); 34 int maxx(int a,int b); 35 int minn(int a,int b); 36 int Del_bit_1(int n); 37 int lowbit(int n); 38 int abss(int a); 39 //const long long INF=(1LL<<60); 40 const double E=2.718281828; 41 const double PI=acos(-1.0); 42 const int inf=(1<<30); 43 const double ESP=1e-9; 44 const int mod=(int)1e9+7; 45 const int N=(int)2e6+10; 46 void PR(int _[],int n) 47 { 48 for(int i=1;i<=n;++i) 49 pr("%d ",_[i]); 50 pr("\n"); 51 } 52 char s[N],s1[N],s2[N]; 53 int a[N]; 54 int sa[N],rk[N],s_a[N],t[N];//桶的大小要为N,因为放的是rank; 55 int height[N],h[N];//h是位置i的长度,heidgt是ranki的长度; 56 void Init(int _[],int n) 57 { 58 for(rint i=0;i<=n;++i) 59 _[i]=0; 60 } 61 bool cmp(int i,int j,int k) 62 { 63 return s_a[i]==s_a[j]&&s_a[i+k]==s_a[j+k]; 64 } 65 void Sort(int len) 66 { 67 int m=30;//字符集大小; 68 for(rint i=1;i<=len;++i) ++t[a[i]],rk[i]=a[i]; 69 for(rint i=1;i<=m;++i) t[i]+=t[i-1]; 70 for(rint i=len;i>=1;--i) sa[t[rk[i]]--]=i; 71 for(rint k=1;k<=len;k<<=1) 72 { 73 int cnt=0; 74 //按第二个rank排; 75 for(rint i=len-k+1;i<=len;++i) s_a[++cnt]=i; 76 for(rint i=1;i<=len;++i)if(sa[i]>k) s_a[++cnt]=sa[i]-k; 77 //按第一个rank排; 78 Init(t,m); 79 for(rint i=1;i<=len;++i) ++t[rk[s_a[i]]]; 80 for(rint i=1;i<=m;++i) t[i]+=t[i-1]; 81 for(rint i=len;i>=1;--i) sa[t[rk[s_a[i]]]--]=s_a[i]; 82 83 swap(rk,s_a);rk[sa[1]]=cnt=1; 84 for(rint i=2;i<=len;++i) 85 rk[sa[i]]=cmp(sa[i],sa[i-1],k)?cnt:++cnt; 86 if(cnt==len)break; 87 m=cnt; 88 } 89 //求height数组; 90 for(rint i=1;i<=len;++i) 91 { 92 h[i]=max(0,h[i-1]-1); 93 if(rk[i]==1)continue; 94 while(a[i+h[i]]==a[sa[rk[i]-1]+h[i]]) ++h[i]; 95 } 96 for(rint i=1;i<=len;++i) height[i]=h[sa[i]]; 97 } 98 99 int ans[N],res[N]; 100 101 int main() 102 { 103 // freopen("D:\\Chrome Download\\testdata (2).in","r",stdin); 104 int len1,len2; 105 sc("%d%d",&len1,&len2); 106 sc("%s%s",s1+1,s2+1); 107 int len=0; 108 for(int i=len1;i>=1;--i) 109 a[++len]=s1[i]-‘a‘+1; 110 a[++len]=27; 111 for(int i=len2;i>=1;--i) 112 a[++len]=s2[i]-‘a‘+1; 113 Sort(len); 114 // PR(height,len); 115 // PR(sa,len); 116 // PR(rk,len); 117 int temp=0; 118 for(int i=1;i<=len;++i) 119 { 120 // temp=min(temp,height[i+1]); 121 if(sa[i]<=len1) 122 temp=height[i+1]; 123 else 124 ans[i]=temp,temp=min(temp,height[i+1]); 125 } 126 temp=0; 127 for(int i=len;i>=1;--i) 128 { 129 // temp=min(temp,height[i+1]); 130 if(sa[i]<=len1) 131 temp=height[i]; 132 else 133 ans[i]=max(ans[i],temp),temp=min(temp,height[i]); 134 } 135 // PR(ans,len); 136 ll Ans=0; 137 for(int i=len;i>=len1+2;--i) 138 { 139 res[i]=max(res[i+1],ans[rk[i]]); 140 Ans+=res[i]; 141 } 142 pr("%lld\n",Ans); 143 return 0; 144 } 145 146 /**************************************************************************************/ 147 148 int maxx(int a,int b) 149 { 150 return a>b?a:b; 151 } 152 153 void swapp(int &a,int &b) 154 { 155 a^=b^=a^=b; 156 } 157 158 int lowbit(int n) 159 { 160 return n&(-n); 161 } 162 163 int Del_bit_1(int n) 164 { 165 return n&(n-1); 166 } 167 168 int abss(int a) 169 { 170 return a>0?a:-a; 171 } 172 173 double fabss(double a) 174 { 175 return a>0?a:-a; 176 } 177 178 int minn(int a,int b) 179 { 180 return a<b?a:b; 181 }
标签:col pair fir strstr code scan eid element stdin
原文地址:https://www.cnblogs.com/--HPY-7m/p/11562951.html