Пример #1
0
vector<vector<int> > palindromePairs(vector<string>& words) {
    vector<vector<int> > res;
    int n = words.size();
    if(n <= 1) return res;
    unordered_map<string, int> map;
    for(int i = 0;i < n;i++)
        map[words[i]] = i;
    for(int i = 0;i < n;i++) {
        string s = words[i];
        int left = 0, right = 0;
        while(right < s.size()) {
            string r = s.substr(0, right);
            reverse(r.begin(), r.end());
            if(isPalin(s.substr(right, s.size()-right)) && map.count(r) && i != map[r]) {
                res.push_back({i, map[r]});
            }
            right++;
        }
        while(left <= s.size()) {
            string r = s.substr(left, s.size()-left);
            reverse(r.begin(), r.end());
            if(isPalin(s.substr(0, left)) && map.count(r) && i != map[r]) {
                res.push_back({map[r], i});
            }
            left++;
        }

    }
    return res;
}
Пример #2
0
int main (int argv, char ** argc){
  (void) argv;
  (void) argc;

  int x, y;
  
  int result = 0;

  assert(isPalin(1001));
  assert(! isPalin(1737));
  
  for(x = 100; x < 1000; x ++){
    for(y = x; y < 1000; y ++){
      int temp = x * y;
      if(temp > result && isPalin(temp)){
	result = temp;
      }
    }

  }

  printf("Result : %d\n", result);

  
  return 0;
}
Пример #3
0
Файл: test.c Проект: sency90/acm
main()
{
  int t;
  for(scanf("%d",&t);t--;)
  {
    int n;
    scanf("%d ",&n);
    int i,j;
    for(i=0;i<n;i++)wLen[i]=strlen(gets(word[i]));
    for(i=0;i<n;i++)
    {
      strcpy(b,word[i]);
      for(j=0;j<n;j++)
      {
        if(i!=j)
        {
          strcpy(b+wLen[i],word[j]);
//          printf("[!]%s %s\n",word[i],word[j]);
          if(isPalin(wLen[i]+wLen[j]))
          {
            puts(b);
            break;
          }
        }
      }
      if(j!=n)break;
    }
    if(j==n)puts("0");
  }
}
Пример #4
0
int minCut(string s) {
	int n = s.length();
	vector<vector<bool> > isPalin(n, vector<bool>(n, false));

	for (int i = 0; i < n; i++) {
		isPalin[i][i] = true;
		if (i < n-1 && s[i] == s[i+1]) 
			isPalin[i][i+1] = true;
	}
	for (int i = n-2; i >= 0; i--) {     // important!
		for (int j = i+2; j < n; j++) {
			if (s[i] == s[j] && isPalin[i+1][j-1])
				isPalin[i][j] = true;
		}
	}

	vector<int> d(n, 0);
	for (int i = 1; i < n; i++) {
		d[i] = d[i-1] + 1;
		for (int k = 0; k <= i; k++) {
			if (k == 0 && isPalin[0][i]) {
				d[i] = 0;
			} else if (isPalin[k][i]) {
				d[i] = min(d[i], d[k-1]+1);
			}
		}
	}   
	return d[n-1];     
}
Пример #5
0
char isPalin(int x, int y){
	char res = 0;

	if ( x >= y ) return 1;
	if ( dp2[x][y] != -1 ) return dp2[x][y];
	
	if ( str[x] == str[y] ) res = isPalin(x + 1, y - 1);
	
	return dp2[x][y] = res;
}
Пример #6
0
vector<vector<string>> partition(string s) {
        vector<vector<string>> result;
        if( s.size()<=0)
            return result;
        int size = s.size();
        vector<vector<bool>> isPalin(size,vector<bool>(size,false));
        getPalin(isPalin,s);
        vector<string> cur;
        dfs(result,cur,0,s,isPalin);
        
        return result;
    }
Пример #7
0
main()
{
	int i;
	int isPalin(int);
	int isPrime(int);
	char intro[] = "This is a number";
	printf("Hello World\n");
	for(i=0; i<15000; i++) {
		if(isPrime(i)==1 && isPalin(i)==1) {
			printf("%s %d is a palindrome\n",intro,i);
		}
	}
}
 vector<vector<string>> partition(string s) {
     result.clear();
     int N = s.size();
     vector<vector<bool>> isPalin(N, vector<bool>(N, true));
     setIsPalin(s, isPalin, N);
     vector<string> tmp;
     for(int i = 0; i < N; i++){
         if(isPalin[0][i]){ //如果从0到i是回文,则对余下字符串判断是否能划分
             part(0, i, tmp, s, isPalin, N);
         }
     }
     return result;
 }
Пример #9
0
long rec(int x, int y){
	long res = 0;
	
	if ( x > y ) return 0;
	if ( x == y ) return 1;
	
	if ( dp[x][y] != -1 ) return dp[x][y];
	
	res += rec(x, y - 1) + rec(x + 1, y);
	res -= rec(x + 1, y - 1);
	if ( isPalin(x,y) ) res++;
	
	return dp[x][y] = res;
}
Пример #10
0
 void partition(int start) {
     if(start > len-1 ) {
         res.push_back(path);
         return;
     }
     for(int i=1; i<=len-start; i++) { // i is len
         string str = s.substr(start, i);
         if(isPalin(str)) {
             path.push_back(str);
             partition(start+i);
             path.pop_back();
         }
     }
 }
Пример #11
0
int main()
{
int t,a,b,k=0,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
for(i=a;i<=b;i++)
{
if(isPalin(i))
{
k++;
}
}
printf("%d\n",k);
k=0;
}
return 0;
}
Пример #12
0
 int minCut(string s) {
     int n = s.length();
     vector<vector<bool>> isPalin(n, vector<bool>(n, false));
     vector<int> dp(n, INT_MAX);
     for (int i = 0; i < n; i++) {
         isPalin[i][i] = true;
     }
     dp[n - 1] = 0;
     for (int i = n - 2; i >= 0; i--) {
         dp[i] = dp[i + 1] + 1;
         for (int j = i + 1; j < n; j++) {
             if (s[i] == s[j]) {
                 if (i + 1 == j || isPalin[i + 1][j - 1]) {
                     isPalin[i][j] = true;
                     if (j + 1 == n) dp[i] = 0;
                     else dp[i] = min(dp[j + 1] + 1, dp[i]);
                 }
             }
         }
     }
     return dp[0];
 }
 int minCut(string s) {
   if (s.length() == 1) return 0;
   
   vector<vector<bool> > isPalin(s.length(), vector<bool>(s.length(), false));
   
   for (int L = 1; L <= s.length(); L ++) {
     for (int i = 0; i < s.length() - L + 1; i ++) {
       int j = i + L - 1;
       if (s[i] == s[j]) {
         if (i + 1 >= j - 1 || isPalin[i + 1][j - 1]) {
           isPalin[i][j] = true;
         }
       }
     }
   }
   
   vector<int> m(s.length(), INT_MAX);
   
   for (int i = 0; i < s.length(); i ++) {
     m[i] = i;
   }
   
   for (int i = 0; i < s.length(); i ++) {
     if (isPalin[0][i]) {
       m[i] = 0;
       continue;
     }
     
     for (int j = i - 1; j >= 0; j --) {
       if (isPalin[j + 1][i]) {
         m[i] = min(m[i], 1 + m[j]);
       }
     }
   }
   
   return m[s.length() - 1];
 }