KMP
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 1e7;
void GetNext(string s, int Next[])
{
Next[0] = -1, Next[1] = 0;
int f = 0, t = 2;
while(t < s.size())
{
if(s[t-1] == s[f])
Next[t++] = s[t-1]==s[++f] ? Next[f] : f;
else if(f > 0)
f = Next[f];
else if(f == 0)
Next[t++] = 0;
}
}
// 查找s2在s1中的位置,如果没有返回-1
int KMP(string s1, string s2)
{
int len1 = s1.size();
int len2 = s2.size();
if(len1 < len2)
return -1;
int i1 = 0, i2 = 0;
int Next[123];
GetNext(s2,Next);
while(i1 < len1 && i2 < len2)
{
if(s1[i1] == s2[i2])
i1++, i2++;
else if(Next[i2] == -1)
i1++;
else
i2 = Next[i2];
}
return i2 == len2 ? i1-len2 : -1;
}
int main()
{
string s1, s2;
cin >> s1 >> s2;
int pos = KMP(s1, s2);
cout << pos << endl;
return 0;
}
Manacher
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
const int MAXN = 1e6;
string GetMaStr(string s)
{
string s1 = "";
int s1Len = s.size()*2 + 1 , index = 0;
for (int i = 0; i < s1Len; i++)
s1 += (i&1) == 0 ? '#' : s[index++];
return s1;
}
int Manacher(string s)
{
if (s.size()==0) return 0;
const int len = s.size()*2+1;
int Rlen[len];
s = GetMaStr(s);
int C = -1, R = -1, maxl = 0;
for (int i = 0; i < len; i++)
{
Rlen[i] = R > i ? min(Rlen[2*C-i], R-i) : 1;
while(i+Rlen[i] < len && i-Rlen[i] > -1)
{
if(s[i+Rlen[i]] == s[i-Rlen[i]]) Rlen[i]++;
else break;
}
if (i+Rlen[i] > R)
R = i + Rlen[i], C = i;
maxl = max(maxl, Rlen[i]);
}
return maxl - 1;
}
Dijkstra(点1~n)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int, int> P;
const int MAXN = 1000+1;
const int INF = 0x3f3f3f3f;
int dis[MAXN];
struct Edge{ int to, val; } t;
vector<Edge> G[MAXN];
void dijkstra(int s)
{
priority_queue<P, vector<P>, greater<P> > q;
q.push(P(dis[s], s));
while (!q.empty())
{
P T = q.top();
q.pop();
int id = T.second;
if (dis[id] != T.first)
continue;
for (int i = 0; i < G[id].size(); i++) {
t = G[id][i];
if (dis[t.to] > dis[id] + t.val) {
dis[t.to] = dis[id] + t.val;
q.push(P(dis[t.to], t.to));
}
}
}
}
void init(int n)
{
for (int i = 0; i <= n; i++)
dis[i] = INF;
dis[1] = 0;
}
int main()
{
int m, n, a, b;
cin >> m >> n;
init(n);
for (int i = 0; i < m; i++) {
cin >> a >> t.to >> t.val;
G[a].push_back(t);
}
dijkstra(1);
cout << dis[n] << endl;
return 0;
}