游客 Signup | Login
中文 | En

2015 - 平方字符串

通过次数

0

提交次数

0

Time Limit : 1 秒 Memory Limit : 128 MB
定义“平方字符串”,意思为一个字符串s[1…n],其中子串s1[1…k]和s2[k+1…n]完全相等。例如”abab”,”aaaa”是平方字符串,”aba”,”abca”就不是
有如下几种操作:
1.       将任意一个字符替换成另外一个字符
2.       可以在字符串的任意一个地方插入一个字符
3.       可以删去字符串的任意一个字符
给一个初始字符串,问经过上述操作最少几次能够将该字符串变成“平方字符串”。

Input

第一行输入一个数T,表示测试数据个数,对于每个测试数据输入一个字符串,表示初始的字符串,字符串长度<=100

Output

对于每个测试数据输出一个数,表示最少操作次数。

Examples

Input Format

3
abcdabcmd
abcdabyd
abcdabcd

Output Format

1
1
0

Solution C++

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<stack>
#include<iostream>
#include<queue>
#include<cmath>
#include<string>
#include<set>
#include<map>
using namespace std;
const int maxn = 100 + 5;
const int mod = 1000000000 + 7;
const double eps = 1e-7;
const int INF = 1000000000;
typedef long long LL;
typedef pair<int, int> P;

char s[maxn];
int dp[maxn][maxn];

int solve(int s1, int e1, int s2, int e2){
            memset(dp, 0, sizeof dp);
            int tag = 0;
            for(int i = s2;i <= e2;i++){
                if(s[0]==s[i])
                    tag = 1;
                if(tag)
                    dp[0][i] = i-s2;
                else
                    dp[0][i] = i-s2+1;
            }
            tag = 0;
            for(int i = s1;i <= e1;i++){
                if(s[s2]==s[i])
                    tag = 1;
                if(tag == 1)
                    dp[i][s2] = i-s1;
                else
                    dp[i][s2] = i-s1+1;
            }

            for(int i = s1+1;i <= e1;i++){
                for(int j = s2+1;j <= e2;j++){
                    if(s[i]==s[j])
                        dp[i][j] = dp[i-1][j-1];
                    else{
                        dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))+1;
                    }
                }
            }
            return dp[e1][e2];
}

int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        scanf("%s", s);
        int n = strlen(s);
        if(n == 1){
            printf("1\n");
            continue;
        }
        int ans = n;
        int s1 = 0, e1;
        int s2, e2 = n-1;
        for(int i = 0;i < n-1;i++){
            e1 = i;
            s2 = i+1;
            //cout << solve(s1, e1, s2, e2) << endl;
            ans = min(ans, solve(s1, e1, s2, e2));
        }
        printf("%d\n", ans);


    }
    return 0;
}