The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
Problem A?Vertices in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5989
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4100
Problem B?Element Swapping
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5990
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4101
題意:數組a通過交換一對數字,得到了b數組,給出x=和y=和b數組,問有多少對l,r(l<=r)能滿足條件
C++版本一
題解:規律+數學
1、;
2、
3、,則;
4、,則不合法數據;
5、,,則不合法數據;
6、,,對于某一個位置i,可以推出應該交換的位置,其中,不一定在范圍內,不一定在范圍內;
7、對于每個再完成上述操作后,放進vector;
8、可以查詢vector是否操作 ,當然直接詢問;
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=200000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r; ll x,y; ll ans,cnt,flag,temp,X,Y; ll b[N]; vector<int>v[M]; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%lld%lld",&n,&x,&y);X=Y=0;for(int i=1;i<=100000;i++)v[i].clear();for(int i=1;i<=n;i++){scanf("%lld",&b[i]);X+=i*b[i];Y+=i*b[i]*b[i];}//cout<<X<<" "<<Y<<endl;ll needx=x-X,needy=y-Y;ans=0;if(needx==0&&needy==0){//needx==0&&needy==0時,任意兩個相同的元素都可以交換for(int i=1;i<=n;i++){ans+=v[b[i]].size();v[b[i]].push_back(i);}}else if(needx==0){ans=0;}else if(needy%needx==0){//needx和needy必須倍數關系//cout<<needx<<" "<<needy<<endl;ll need=needy/needx;//cout<<need<<endl;for(int i=1;i<=n;i++){if(need-2*b[i]&&1<=need-b[i]&&need-b[i]<=100000){int j=i-needx/(need-2*b[i]);vector<int>::iterator it=lower_bound(v[need-b[i]].begin(),v[need-b[i]].end(),j);//cout<<need-b[i]<<" "<<i-needx/(need-2*b[i])<<endl;if(it!=v[need-b[i]].end()&&*it==j){//it不能是end(),不然會段錯誤ans++;}}v[b[i]].push_back(i);}}cout<<ans<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }C++版本二
題解:
原博客?
#include<bits/stdc++.h> #define ll long long #define Map map<ll,ll>::iterator #define MAXN 100005 #define se second using namespace std; map<ll,ll>cnt; ll X1,Y1,X2,Y2,a[MAXN]; int T,n; int main(){cin>>T;while(T--){cnt.clear();scanf("%d%lld%lld",&n,&X1,&Y1);X2=Y2=0;for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);cnt[a[i]]++;X2+=a[i]*i;Y2+=a[i]*a[i]*i;}ll dx=X2-X1,dy=Y2-Y1;if(dx==0){if(dy!=0){puts("0");continue;}ll ans=0;for(Map it=cnt.begin();it!=cnt.end();it++){ans+=((it->se)-1)*(it->se)/2;}printf("%lld\n",ans);continue;}if(dy%dx){puts("0");continue;}//cout<<dx<<" "<<dy<<endl;ll dt=dy/dx,ans=0;//cout<<dt<<endl;for(ll i=1;i<=n;i++){ll Aj=dt-a[i];if((Aj-a[i])==0)continue;ll j=(dx+(Aj-a[i])*i)/(Aj-a[i]);if(j<=i||j>n)continue;if(a[j]==Aj)ans++;}printf("%lld\n",ans);} }?
Problem C?Array in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5991
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4102
Problem D?Traveler
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5992
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4103
Problem E?Sequence in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5993
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4104
題解:排序,查找有多少是不需要操作的
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; int a[N],b[N]; char str; struct node{}; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}sort(b+1,b+n+1);int pos=n;for(int i=n;i>=1;i--){if(a[i]==b[pos])pos--;}cout<<pos<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem F?Abbreviation
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5994
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4105
題意:刪去除第一個字符以外,所有的元音字母
題解:模擬?
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; int a[N]; char str[N]; struct node{}; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){//scanf("%d",&n);cin>>str;string ans="";ans+=str[0];for(int i=1;str[i]!='\0';i++){if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u'||str[i]=='y')continue;ans+=str[i];}cout<<ans<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem G?Lucky 7 in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5995
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4106
?題意:求大于等于n的最小可以被7整除不能被4整除的數
題解:預處理+二分
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; int a[N]; char str; struct node{}; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);for(int i=1;i<1000;i++){if(i%7==0&&i%4!=0){a[++cnt]=i;}}//cout<<cnt<<endl;scanf("%d",&t);while(t--){scanf("%d",&n);cout<<a[lower_bound(a+1,a+cnt+1,n)-a]<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem H?Singing Everywhere
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5996
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4107
題意:至多刪除一個點,使得破音數量最少
題解:前綴+后綴+枚舉?
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; int a[N],pre[N],suf[N]; char str; struct node{}; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d",&n);memset(pre,0,sizeof(pre));memset(suf,0,sizeof(suf));for(int i=1;i<=n;i++)scanf("%d",&a[i]);if(n<=2){cout<<0<<endl;continue;}for(int i=2;i<n;i++){pre[i]=pre[i-1]+(a[i-1]<a[i]&&a[i+1]<a[i]);}for(int i=n-1;i>1;i--){suf[i]=suf[i+1]+(a[i-1]<a[i]&&a[i+1]<a[i]);}ans=min(suf[2]-(a[1]<a[2]&&a[3]<a[2]),pre[n-1]-(a[n-2]<a[n-1]&&a[n]<a[n-1]));ans=min(ans,min(pre[n-3]+(a[n-3]<a[n-2]&&a[n]<a[n-2]),suf[4]+(a[1]<a[3]&&a[4]<a[3])));for(int i=3;i<=n-2;i++){//cout<<pre[i]<<" "<<suf[i]<<" "<<pre[i-2]+suf[i+2]+(a[i-2]<a[i-1]&&a[i+1]<a[i-1])+(a[i-1]<a[i+1]&&a[i+2]<a[i+1])<<endl;ans=min(ans,pre[i-2]+suf[i+2]+(a[i-2]<a[i-1]&&a[i+1]<a[i-1])+(a[i-1]<a[i+1]&&a[i+2]<a[i+1]));}cout<<min(ans,pre[n-1])<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem I?Fibonacci in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5997
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4108
題意:求斐波那契數列區間[l,r]之和的奇偶性
題解: 規律
1、斐波那契數列奇偶性為 1 1 0 1 1 0 1 1 0 ......;
2、在區間,如果時為奇數,時為偶數;
3、詢問一個數的余數=各位數字之和;
4、奇數-奇數=奇數,偶數-偶數=偶數,奇數-偶數=奇數,偶數-奇數=奇數;
5、詢問和的奇偶性,不相同則1,相同則0;
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; char a[N],b[N]; char str; struct node{}; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){//scanf("%d",&n);cin>>a>>b;sum=0;ans=0;for(int i=0;a[i]!='\0';i++){sum+=a[i]-'0';}for(int i=0;b[i]!='\0';i++){ans+=b[i]-'0';}sum%=3;sum=(sum+2)%3;ans%=3;sum=sum==1;ans=ans==1;cout<<(ans!=sum)<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem J?Welcome Party
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=6000
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4109
?
題意:n個人參加會議,如果當參與者進入大廳時,如果他或她發現他或她的朋友都不在大廳中,那么即使他或她的朋友稍后將進入大廳,該參與者也會感到不快樂。求最小化不滿意參與者數量,并給出一個入場順序,如果存在多個答案,輸出字典序最小的順序
題解:并查集+優先隊列
不要用memset,TLE警告
C++版本一
鏈式向前星邊存
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=1000000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans[N],cnt,flag,temp,sum; int vis[N],pre[N],head[N]; char str; struct node{}; struct Edge {int to;int next; } edge[N * 2]; int cnt_edge = 0; void add_edge(int from, int to) {edge[cnt_edge].to = to;edge[cnt_edge].next = head[from];head[from] = cnt_edge++; } int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} priority_queue<int,vector<int>,greater<int> >q; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){vis[i]=0;head[i]=-1;pre[i]=i;//G[i].clear();}cnt=0;sum=0;while(!q.empty()){q.pop();}//memset(vis,0,sizeof(vis));//memset(head, -1, sizeof(head));cnt_edge = 0;//memset(pre,0,sizeof(pre));while(m--){scanf("%d%d",&u,&v);//G[u].push_back(v);//G[v].push_back(u);add_edge(u,v);add_edge(v,u);int tu=find(u);int tv=find(v);if(tu!=tv){if(tu<tv)pre[tv]=tu;elsepre[tu]=tv;}}for(int i=1;i<=n;i++){if(pre[i]==i){sum++;q.push(i);vis[i]=1;}}while(!q.empty()){int u=q.top();q.pop();ans[++cnt]=u;for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;if(vis[v]==0){vis[v]=1;q.push(v);}}}cout<<sum<<endl;for(int i=1;i<=n;i++)printf("%d%c",ans[i]," \n"[i==n]);}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }?C++版本二
vector邊存
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=1000000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans[N],cnt,flag,temp,sum; int vis[N],pre[N]; char str; struct node{}; vector<int>G[N]; int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} priority_queue<int,vector<int>,greater<int> >q; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){vis[i]=0;pre[i]=i;G[i].clear();}cnt=0;sum=0;while(!q.empty()){q.pop();}while(m--){scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);int tu=find(u);int tv=find(v);if(tu!=tv){if(tu<tv)pre[tv]=tu;elsepre[tu]=tv;}}for(int i=1;i<=n;i++){if(pre[i]==i){sum++;q.push(i);vis[i]=1;}}while(!q.empty()){int u=q.top();q.pop();ans[++cnt]=u;for(int i=0,j=G[u].size();i<j;i++){int v=G[u][i];if(vis[v]==0){vis[v]=1;q.push(v);}}}cout<<sum<<endl;for(int i=1;i<=n;i++)printf("%d%c",ans[i]," \n"[i==n]);}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }Problem K?Strings in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5998
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4110
題意:反轉某一個區間的子字符串,使得兩個字符串相同
題解:
1、判斷兩個字符串是否完全相同;
2、完全相同則Manacher's Algorithm求回文字符串數量;
3、不完全相同則分別從頭從尾至不相同得到區間[l,r],反轉這個區間判斷是否和另一個字符串相同;
4、3中不相同則ans==0;
5、3中相同則同時向兩邊擴張,條件是同時加1,并且相同
C++版本一
?
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=2000000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; ll ans,cnt,flag,temp,sum; char a[N],b[N]; int P[N<<1]; char str; struct node{}; ll Manacher(string s) {/*改造字符串*/string res="$#";for(int i=0;i<s.size();++i){res+=s[i];res+="#";}/*數組*/ll ans=0;int mi=0,right=0; //mi為最大回文串對應的中心點,right為該回文串能達到的最右端的值for(int i=1;i<res.size();++i){P[i]=right>i ?min(P[2*mi-i],right-i):1; //關鍵句,文中對這句以詳細講解while(res[i+P[i]]==res[i-P[i]])++P[i];if(right<i+P[i]){ //超過之前的最右端,則改變中心點和對應的最右端right=i+P[i];mi=i;}ans+=P[i]/2;}return ans; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endifios::sync_with_stdio(false);cin.tie(0);//cout.tie(0);//scanf("%d",&t);cin>>t;while(t--){//scanf("%s%s",a,b);cin>>a>>b;int len=strlen(a);for(l=0;l<len&&a[l]==b[l];l++);for(r=len-1;r>=0&&a[r]==b[r];r--);if(l>r){cout<<Manacher(a)<<endl;}else{flag=1;for(int i=l;i<=r;i++){if(a[i]!=b[r-i+l]){flag=0;break;}}if(flag){ans=1;while(l-1>=0&&r+1<=len-1&&a[l-1]==a[r+1])ans++,l--,r++;cout<<ans<<endl;}else{cout<<0<<endl;}}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }C++版本二
原博客
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<math.h> using namespace std; const int N=2e6+50; char s1[N],s2[N],s[N*2]; int len[N*2]; int mi(int a,int b){if(a<b) return a;return b; } int main(){int t,i,n,k,p,ma;scanf("%d",&t);while(t--){scanf("%s%s",s1+1,s2+1);n=strlen(s1+1);k=1;for(i=1;i<=n;i++) if(s1[i]!=s2[i]) k=0;if(k){for(i=1;i<=n+1;i++){s[i*2]=s1[i];s[i*2-1]='*';}s[0]='#';p=ma=0;long long ans=0;for(i=1;i<=2*n;i++){if(ma>i) len[i]=mi(ma-i,len[2*p-i]);else len[i]=1;while(s[i+len[i]]==s[i-len[i]]) len[i]++;if(ma<len[i]+i){ma=len[i]+i;p=i;}ans+=len[i]/2;}printf("%lld\n",ans);}else{int l=1,r=n,ans=1;while(s1[l]==s2[l]) l++;while(s1[r]==s2[r]) r--;for(i=l;i<=r;i++) if(s1[i]!=s2[r-(i-l)]) ans=0;if(ans==0) printf("0\n");else{ma=1;while(l-ma>=1&&r+ma<=n&&s1[l-ma]==s1[r+ma]) ma++;printf("%d\n",ma);}}}return 0; }?
Problem L?Square on the Plane
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5999
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4111
?
?
Problem M?Trees in the Pocket
比賽地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=6001
補題地址:?http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4112
?
總結
以上是生活随笔為你收集整理的The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Inverse of Rows and
- 下一篇: Element Swapping