AOJ 1152 Organize Your Train part II

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1142&lang=jp
D言語らしいコードが書けた
mutableじゃないとreverseできない(当たり前)とかimmutableだと~が使えない(なんでだろう?)で引っかかった
例えば,下の解答の一部で

char[] v = str[0..i].dup;
char[] u = str[i..$].dup;
ans[v~u] = true;

とするとコンパイラに怒られる.

以下解答

import std.stdio;
import std.string;
import std.conv;
import std.algorithm;
import std.range;
void main(){
    for(int m = to!int(chomp(readln())); m>0; m--){
        bool[string] ans;
        string str = chomp(readln());
        for(int i = 0; i <= str.length; i++){
            char[] v = str[0..i].dup;
            char[] u = str[i..$].dup;
            string w = v.idup;
            string x = u.idup;
            string y = v.reverse.idup;
            string z = u.reverse.idup;
            ans[w~x] = true;
            ans[x~w] = true;
            ans[y~z] = true;
            ans[z~y] = true;
            ans[w~z] = true;
            ans[y~x] = true;
            ans[z~w] = true;
            ans[x~y] = true;
        }
        writeln(ans.length);
    }
}

[追記]
連想配列の添字はimmutableでないといけないことを教えていただきました