zoukankan      html  css  js  c++  java
  • SRM 604 DIV2 250

    题意:给你一个字符串向量,问你有中间多少个串循环相等(循环相等的意思就是   “ab”,“ba”,经过移位以后还相等的字符串)

    解题思路:KMP,这种字符串有一个性质,就是  如果  a的长度等于b的长度,且  能在  a+a 中匹配到b,则可以断定这两个字符串循环相等

    解题代码:

    #include <cstdlib>
    #include <cctype>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <map>
    #include <set>
    #include <queue>
    #include <stack>
    #include <fstream>
    #include <numeric>
    #include <iomanip>
    #include <bitset>
    #include <list>
    #include <stdexcept>
    #include <functional>
    #include <utility>
    #include <ctime>
    using namespace std;
    
    #define PB push_back
    #define MP make_pair
    
    #define REP(i,n) for(i=0;i<(n);++i)
    #define FOR(i,l,h) for(i=(l);i<=(h);++i)
    #define FORD(i,h,l) for(i=(h);i>=(l);--i)
    
    typedef vector<int> VI;
    typedef vector<string> VS;
    typedef vector<double> VD;
    typedef long long LL;
    typedef pair<int,int> PII;
    
    
    int kmp(string a, string b)
    {
        int pi[100];
        int m = b.size();
        memset(pi,0,sizeof(pi));
        pi[0] = -1; 
        int k = -1 ; 
        for(int i = 1 ;i < m ; i ++)
        {
            while(k >= 0 && b[k+1] != b[i]) 
                k = pi[k];
            if(b[k+1] == b[i])
                k = k +1;
            pi[i] = k; 
        }
        int n = a.size();
        int q = -1 ; 
        for(int i = 0;i < n;i ++)
        {
            while(q >= 0 && b[q+1] != a[i])
                q = pi[q];
            if(b[q+1] == a[i])
                q = q +1;
            if(q == m -1)
            {
                return 1;
            }
        }
        return 0 ; 
    
    }
    class FoxAndWord
    {
        public:
            int howManyPairs(vector <string> words)
            {
    
                int k = words.size();
                int sum = 0 ; 
                for(int i = 0;i < k ;i ++)
                    for(int j = i + 1;j < k; j ++)
                    {
                        string temp = words[i] + words[i];
                        if(kmp(temp,words[j])&& words[i].size() == words[j].size())
                        {          sum ++ ;
    
                        }
                    }
    
                return sum ;  
    
            }
    };
    代码
    没有梦想,何谈远方
  • 相关阅读:
    Aster寻路算法1(转)
    谈谈项目纵向项目验收
    要有兴趣
    用c# 操作 文件的方法
    使用ACT进行测试
    Generated servlet error: keyword cannot be resolved or is not a type
    米尔顿艾瑞克森的催眠引导词
    c# webcliend 来制作 网页搜捕器
    网页木马的解决方案
    用Swing实现数据表格功能
  • 原文地址:https://www.cnblogs.com/zyue/p/3515907.html
Copyright © 2011-2022 走看看