7-10 最长对称子串 (25分)
题意:给你一行字符串(含空格),求这个字符串里面最长的回文串的长度;
我的思路:先从一个位置出发,向两边便利,如果相等那就加二。
这样有个问题,就是如果是偶数个的话,答案就不对了;
正确思路:从头和尾部同时遍历,然后碰到相同的就通过一个函数来判断中间的字符串是不是回文,是的话就判断这个字符串的长度与当前最大值的大小关系。
#include using namespace std; bool check(string &s) { for(int i = 0;i < s.length();i++) { if(s[i]==s[s.length()-1-i]) continue; else return false; } return true; } int main() { string s1,s2; getline(cin,s1); int len = s1.length(); int tans = 0; int finans = 0; for(int i = 0;i < len;i++) { for(int j = len-1;j>=i;j--) { s2 = s1.substr(i,j-i+1); if(check(s2)) { tans = s2.length(); } if(tans>finans) { finans = tans; } } } cout<<finans<<endl; }
7-12 分而治之 (25分)
题意:有n个城市,m个桥,然后给你m行数字,表示两个城市之间已经连桥,然后给你一个数字np表示方案数目,然后就是np行,第一个是要摧毁城市的数量,紧接着就是城市,问摧毁这些城市之后,有没有摧毁所有的桥。
思路:用结构体表示城市,用map来表示城市之间的关系,1为连接,0为未连接。然后遍历一遍map如果有存在等于1的那这个方案就不行。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+10; struct node { int x,y; }a[maxn]; int b[maxn]; int main() { int n,m; cin>>n>>m; int i,j; for(i = 0;i < m;i++) { cin>>a[i].x>>a[i].y; } int k; cin>>k; while(k--) { int np; cin>>np; map<int ,int > mp; for(i = 0;i < np;i++) { cin>>b[i]; mp[b[i]] = 1; } int flag = 1; for(i = 0;i < m;i++) { if(mp[a[i].x] != 1&&mp[a[i].y] != 1) { cout<<"NO\n"; flag = 0; break; } } if(flag) cout<<"YES\n"; } }
题意:先给一个节点的初始地址,然后给一个数字,表示结点的数量,然后是n行数据分别是地址,数据和下一个结点的地址,然后从两头输出。
思路:暴力结构体,输入之后进行排序,然后输出
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; struct Node{ int ad,next,data; }mes[maxn],ans[maxn]; int main(){ int f,n,a; scanf("%d%d",&f,&n); for(int i=0;i<n;i++){ scanf("%d",&a); scanf("%d%d",&mes[a].data,&mes[a].next); } int r=1; while(f!=-1){ ans[r].ad=f; ans[r++].data=mes[f].data; f=mes[f].next; } for(int i=1;i<r;i++){//调整顺序 if(i%2==1) mes[i]=ans[r-1-i/2]; else mes[i]=ans[i/2]; } for(int i=1;i<r-1;i++){//疯狂输出 printf("%05d %d %05d\n",mes[i].ad,mes[i].data,mes[i+1].ad); } printf("%05d %d -1\n",mes[r-1].ad,mes[r-1].data); return 0; }