线性表(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 线性表的抽象数据类型描述


线性表的抽象数据类型描述

基本操作如下:

1.线性表的置空操作clear():将一个已经存在的线性表置为空表。
2.线性表判空操作isEmpty():判断线性表是否为空,若为空,则返回true;否则,返回为false。
3.求线性表的长度操作length():求线性表中的数据元素的个数并返回其值。
4.取元素操作get(i):读取并返回线性表中的第i个数据元素的值。其中i的取值范围为0≤i≤length()-1。
5.插入操作insert(i,x):在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i的取值范围为0≤i≤length()。当i=0时,在表头插入x;当i=length()时,在表尾插入x。
6.删除操作remove(i):删除并返回线性表中第i个数据元素。其中i的取值范围为0≤i≤length()-1。
7.查找操作indexOf(x):返回线性表中首次出现的指定的数据元素的位序号,若线性表中不包含此数据元素,则返回-1。


codeforces题目链接:
https://codeforces.com/problemset/problem/1385/D

题解:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
 
const int N = 131080;
int a[N];
 
 
int dfs(int l,int r,int d){
     
    if(r - l == 1){
     
        if((a[l] == d && a[r] == d + 1 )|| (a[l] == d + 1 && a[r] == d)) return 0;
        if(a[l] == d || a[l] == d + 1 || a[r] == d || a[r] == d + 1) return 1;
        return 2;
    }
    int m = (r + l - 1) / 2;
    int sum1 = 0,sum2 = 0;
    for(int i = l;i <= m;i++) if(a[i] == d) sum1++;
    for(int i = m + 1;i <= r;i++) if(a[i] == d) sum2++;
    int ans1 =(m - l + 1 - sum2) + dfs(l,m,d + 1);
    int ans2 =(m - l + 1 - sum1) + dfs(m + 1,r,d + 1);
    return min(ans1,ans2);
}
 
int main(){
     
    int T,n;
    cin >> T;
    while(T--){
     
        cin >> n;
        char str[N];
        cin >> (str + 1);
        for(int i = 1;i <= n;i++) a[i] = str[i] - 'a' + 1;
        if(n == 1){
     
            if(a[1] == 1)
                cout << 0 << endl;
            else
                cout << 1 << endl;
            continue;
        }
        cout << dfs(1,n,1) << endl;;
    }
    
}

你可能感兴趣的:(数据结构)