标签: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
1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
2 #include //sprintf islower isupper
3 #include //malloc exit strcat itoa system("cls")
4 #include //pair
5 #include //freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
6 #include 7 //#include 8 //#includehttps://www.nitacm.com/problem_show.php?pid=585
9 #include 10 #include 11 #include set>
12 #include string.h>//strstr substr
13 #include string>
14 #include //srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
15 #include 16 #include 17 #include //priority_queue, greater > q;//less
18 #include //emplace_back
19 //#include 20 //#include //reverse(a,a+len);// ~ ! ~ ! floor
21 #include //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 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 29 #define rs rt 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
40 const double E=2.718281828;
41 const double PI=acos(-1.0);
42 const int inf=(130);
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;ii)
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;ii)
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;ia[i];
69 for(rint i=1;i1];
70 for(rint i=len;i>=1;--i) sa[t[rk[i]]--]=i;
71 for(rint k=1;k1)
72 {
73 int cnt=0;
74 //按第二个rank排;
75 for(rint i=len-k+1;ii;
76 for(rint i=1;iif(sa[i]>k) s_a[++cnt]=sa[i]-k;
77 //按第一个rank排;
78 Init(t,m);
79 for(rint i=1;it[rk[s_a[i]]];
80 for(rint i=1;i1];
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;ii)
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;ii)
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;ih[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;ii)
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 aa:b;
181 }
后缀数组 LCP--模板题
标签:col pair fir strstr code scan eid element stdin
原文地址:https://www.cnblogs.com/--HPY-7m/p/11562951.html