Java 元素去除算法的改进 问题

Java 元素去除算法的改进 问题,java,algorithm,Java,Algorithm,给定字符串s和m查询。对于每个查询,删除字符x的第次出现的K 例如: abcdbcaab 5 2 a 1 c 1 d 3 b 2 a Ans abbc 我的方法 我正在使用位树进行更新操作 代码: 有一些关键操作未显示,其中一个(很可能是更新方法)的成本与您想象的不同。此外,您所述的复杂性肯定是错误的,因为在某些情况下,您必须扫描最小值为O(N)的字符串 但无论如何,这里显然正确的策略是遍历查询,按字符分隔,然后按相反顺序遍历查询,找出要抑制的字符的初始位置。然后在字符串中运行一次,仅在合适

给定字符串
s
m
查询。对于每个查询,删除字符
x
的第次出现的
K

例如:

abcdbcaab
5
2 a
1 c
1 d
3 b
2 a

Ans abbc
我的方法 我正在使用位树进行更新操作

代码:


有一些关键操作未显示,其中一个(很可能是
更新
方法)的成本与您想象的不同。此外,您所述的复杂性肯定是错误的,因为在某些情况下,您必须扫描最小值为
O(N)
的字符串

但无论如何,这里显然正确的策略是遍历查询,按字符分隔,然后按相反顺序遍历查询,找出要抑制的字符的初始位置。然后在字符串中运行一次,仅在合适时才发出字符。如果实现得好,这个解决方案应该可以在
O(N+mlog(M))
中实现


挑战在于如何有效地表示删除。我在考虑某种相对偏移量的树,这样,如果你发现第一次删除是
3a
,你可以有效地将它插入到树中,并在以后每次删除之后移动它。这是
log(M)
位的位置。

请显示
value
方法的代码好吗?最好知道
N
M
可以有多大,时间限制到底有多大。什么是位树?特别是,如何将
int[][]
解释为树?以及
中的
是什么?如果它是
java.util.Scanner
的实例,则速度可能太慢。无缓冲输出也可能是性能不佳的原因。复杂性不是MLON,它是M(log(n)^ 2)为什么它是偏离主题的问题。算法与计算机科学无关,只考虑语法问题。
for (int i = 0; i < ss.length(); i++) {

    char cc = ss.charAt(i);
    freq[cc-97] += 1;
    if (max < freq[cc-97]) max = freq[cc-97];
    dp[cc-97][freq[cc-97]] = i;                 // Counting the Frequency
}
BIT = new int[27][ss.length()+1];
int[] ans = new int[ss.length()];
int q = in.nextInt();
for (int i = 0; i < q; i++) {
    int rmv = in.nextInt();
    char c = in.next().charAt(0);

    int rr = rmv + value(rmv, BIT[c-97]);              // Calculating the original Index Value
    ans[dp[c-97][rr]] = Integer.MAX_VALUE;

    update(rmv, 1, BIT[c-97], max);            // Updating it
}
for (int i = 0; i < ss.length(); i++) {
    if (ans[i] != Integer.MAX_VALUE) System.out.print(ss.charAt(i));
}
public static void update(int i , int value , int[] arr , int xx){  
    while(i <= xx){
        arr[i ]+= value;
        i += (i&-i);
    }
}

public static int value(int i , int[] arr){
    int ans = 0;

    while(i > 0){
        ans += arr[i];
        i -= (i &- i);
    }
    return ans ;
}