矿大数据结构 作业二
后缀自动机,树,模拟,BFS
·
目录
A.统计回文子串
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int countPalindromicSubstring(string s) {
int n = s.length();
vector<vector<bool>> dp(n, vector<bool>(n, false));
int count = 0;
for (int i = 0; i < n; i++) {
dp[i][i] = true;
count++;
}
for (int i = 0; i < n - 1; i++) {
if (s[i] == s[i + 1]) {
dp[i][i + 1] = true;
count++;
}
}
for (int len = 3; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
if (s[i] == s[j] && dp[i + 1][j - 1]) {
dp[i][j] = true;
count++;
}
}
}
return count;
}
int main() {
string s;
while (cin >> s) {
cout << countPalindromicSubstring(s) << endl;
}
return 0;
}
B.构建矩阵
依据题意遍历即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[10][10];
int main(){
int n;cin>>n;
int k;
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
a[i][j]=i*j;
}
}
for(int i=1;i<=n;i++){
cin>>k;
for(int x=1;x<=k;x++){
for(int y=1;y<=k;y++){
cout<<a[x][y]<<' ';
}
cout<<'\n';
}
}
return 0;
}
C.找规律填数字
#include<bits/stdc++.h>
int main()
{
int a,b,c,d,e;
while(scanf("%d %d %d %d %d",&a,&b,&c,&d,&e)!=EOF)
{
if(a==0&&b==0&&c==0&&d==0&&e==0)
{
break;
}
if((b-a) == (c-b) && (d-c)==(c-b) &&(d-c)==(e-d))
{
int t = b - a;
for(int i = 1;i<=5;i++)
{
printf("%d ",e+i*t);
}
printf("\n");
}
if((b/a) == (c/b)&&(c/b)==(d/c)&&(d/c)==(e/d)&&(b/a)!=1)
{
int t = b/a;
for(int i = 1;i<=5;i++)
{
printf("%d ",e*(int)pow(t,i));
}
printf("\n");
}
if(a+b==c&&b+c==d&&c+d==e)
{
int t1=d,t2=e,s=0;
for(int i = 6;i<11;i++)
{
s=t1+t2;
t1=t2;
t2=s;
printf("%d ",s);
}
printf("\n");
}
}
return 0;
}
D.复原二叉树
给前序和中序,求后序。前序是根左右,中序是左根右,可以看出前序的第一个必定是根,中序遍历中,根左边的是左子树,根右边是右子树。这样,又能找出新的前序遍历和中序遍历,不断递推求解即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void aftord(string beford,string midord){
if(!beford.size()) return;
char a = beford[0];
int k = midord.find(a);
aftord(beford.substr(1,k),midord.substr(0,k));
aftord(beford.substr(k+1),midord.substr(k+1));
cout<<beford[0];
}
string s1,s2;
int main(){
while(cin>>s1>>s2){
aftord(s1,s2);
cout<<'\n';
}
return 0;
}
E.子树的后序遍历
直接把后序遍历给出了,那么直接截取右子树即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s1,s2;
int main(){
cin>>s1>>s2;
char a;cin>>a;
char s = s2[s2.length()-1];
int k = s1.find(s);
cout<<(a=='L' ? s2.substr(0,k) : s2.substr(k,s1.length()-k-1));
return 0;
}
F.迷宫问题
典型的搜索问题。求最优解一般用 bfs ,若用dfs则需判断是否需要更新
#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool a[110][110];
int ans[110][110];
int m,n;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
pair<int,int>st,en;
void dfs(int x,int y){
for(int i=1;i<=4;i++){
int xx = x+dx[i];
int yy = y+dy[i];
if(!a[xx][yy]) continue;
if(ans[xx][yy]==0||ans[xx][yy]>ans[x][y]+1){
ans[xx][yy]=ans[x][y]+1;
dfs(xx,yy);
}
}
}
int main(){
int k;
cin>>k;
while(k--){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char temp;
cin>>temp;
if(temp=='S')
{
st.first=i,st.second=j;
}
if(temp=='-'){
a[i][j]=1;
}
if(temp=='E'){
a[i][j]=1;
en.first=i,en.second=j;
}
}
}
dfs(st.first,st.second);
cout<<(ans[en.first][en.second]==0? -1 : ans[en.first][en.second])<<'\n';
memset(a,0,sizeof a );
memset(ans,0,sizeof ans );
}
return 0;
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)